home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / eb63.zip / PACK1.PRG / EB / EB3.REP < prev    next >
Text File  |  1995-02-22  |  230KB  |  10,280 lines

  1.  
  2.  
  3.       ════════════════════════════════════════════════════════════════
  4.                   EASY BASE PROGRAMMERS REFERENCE
  5.                             Contents
  6.       ────────────────────────────────────────────────────────────────
  7.  
  8.                   Procedure Commands            Page
  9.                   ──────────────────
  10.  
  11.                   Clear Records From             14
  12.                   Copy All From                  21
  13.                   Create Temp As                 23
  14.                   Declare                        37
  15.                   Delay                          40
  16.                   Delete Record                  42
  17.                   Derive Off                     43
  18.                   Display Status                 44
  19.                   Do..Loop                       45
  20.                   Escape On/Off                  48
  21.                   Exit Batch Menu                49
  22.                   Exit Procedure                 50
  23.                   For..Next                      57
  24.                   If Then Else                   71
  25.                   Index Off                      73
  26.                   List Variables                 85
  27.                   Manual Feed                    90
  28.                   Multiple Lines                100
  29.                   Next Batch                    101
  30.                   Odd/Even Page Print           102
  31.                   Pause On/Off                  113
  32.                   Preselect                     115
  33.                   Print                         116
  34.                   Printer Control               117
  35.                   Remark                        125
  36.                   Skip Group                    141
  37.                   Skip Record                   142
  38.                   Subindex                      148
  39.                   Update Record                 160
  40.  
  41.  
  42.                   Utilities                     Page
  43.                   ─────────
  44.  
  45.                   Alter Vat Rates                 4
  46.                   Backup Application              6
  47.                   Change Password                11
  48.                   Data Import                    29
  49.                   Delete Choice Lists            41
  50.                   Install Form                   75
  51.                   Install Printer                76
  52.                   Install Procedure              77
  53.                   List File Names                84
  54.                   Options                       109
  55.                   Pack Data Forms               111
  56.                   Rebuild Directories           123
  57.                   Restore                       126
  58.                   Screen Colours                134
  59.                   Set Paper Length              138
  60. ................................................................................
  61.  
  62.  
  63.                   Functions                     Page
  64.                   ─────────
  65.  
  66.                   Abs                             1
  67.                   Chr$                           13
  68.                   Datetext                       33
  69.                   Dayofmonth                     34
  70.                   Dayofweek                      35
  71.                   Dayofyear                      36
  72.                   Default                        38
  73.                   Hours                          69
  74.                   If                             70
  75.                   Intext                         79
  76.                   Jointext                       80
  77.                   Lefttext                       81
  78.                   Lengthtext                     82
  79.                   Lookup                         86
  80.                   Lower                          87
  81.                   Makedate                       88
  82.                   Maketime                       89
  83.                   Maths                          91
  84.                   Midtext                        95
  85.                   Minutes                        96
  86.                   Mod                            97
  87.                   Month                          98
  88.                   Proper                        119
  89.                   Random                        121
  90.                   Retail                        127
  91.                   Reverse                       129
  92.                   Righttext                     130
  93.                   Round                         131
  94.                   Seconds                       135
  95.                   Spacepad                      143
  96.                   Spellday                      144
  97.                   Spellmonth                    145
  98.                   Stringof                      147
  99.                   Timeampm                      156
  100.                   Upper                         161
  101.                   V.A.T. Functions              162
  102.                   Year                          164
  103.                   Zeropad                       165
  104.  
  105.  
  106.                   Field Controls                Page
  107.                   ──────────────
  108.  
  109.                   Beep                            7
  110.                   Clearfields                    15
  111.                   Delay                          39
  112.                   Run                           132
  113. ................................................................................
  114.  
  115.  
  116.                   Field Types                   Page
  117.                   ───────────
  118.  
  119.                   Choice                         12
  120.                   Date                           32
  121.                   Fixed Point                    55
  122.                   Floating Point                 56
  123.                   Formatted Text                 65
  124.                   Integer                        78
  125.                   Text                          153
  126.                   Text Block                    154
  127.                   Time                          155
  128.  
  129.  
  130.                   Field Derivation Prefixes     Page
  131.                   ─────────────────────────
  132.  
  133.                   Autodial                        5
  134.                   Current                        25
  135.                   Goto (Field) Next              68
  136.                   Retest                        128
  137.                   Start Here                    146
  138.  
  139.  
  140.                   System Values                 Page
  141.                   ─────────────
  142.  
  143.                   Blank.                          8
  144.                   Bottom Margin                   9
  145.                   Current Record                 26
  146.                   File_date File_time            51
  147.                   File_len                       52
  148.                   File_pos                       53
  149.                   Global Number                  67
  150.                   Output                        110
  151.                   Page Number                   112
  152.                   Pi                            114
  153.                   Prog_dir                      118
  154.                   Record Number                 124
  155.                   Sequence                      137
  156.                   System Date                   150
  157.                   System Time                   151
  158.                   Total Copies                  157
  159.                   Total Records                 158
  160. ................................................................................
  161.  
  162.  
  163.                   File Commands
  164.                   ─────────────
  165.  
  166.                   Close                          16
  167.                   Erase                          47
  168.                   Find                           54
  169.                   Open                          105
  170.                   Read                          122
  171.                   Seek                          136
  172.                   Shell                         140
  173.                   Write                         163
  174.  
  175.  
  176.                   User Menu Functions           Page
  177.                   ───────────────────
  178.  
  179.                   Menu Calls                     94
  180.  
  181.  
  182.                   Operators                     Page
  183.                   ─────────
  184.  
  185.                   Arithmetic                    106
  186.                   Logical                       108
  187.                   Relational                    107
  188.  
  189.  
  190.                   Methods                       Page
  191.                   ───────
  192.  
  193.                   Address Labels                  2
  194.                   Bypass Sign-on Sreen           10
  195.                   Compound Index                 17
  196.                   Compound Lookups               20
  197.                   Correcting Stats.              22
  198.                   Creating Runtime               24
  199.                   Customize Help Line            27
  200.                   Cyclic Procedures              28
  201.                   Data Type Conversion           31
  202.                   Duplicate Prevention           46
  203.                   Form Letters                   63
  204.                   Global Defaults                66
  205.                   Input Screen Format            74
  206.                   Linking Applications           83
  207.                   Maximizing Speed               92
  208.                   Multiple Columns               99
  209.                   Q And A Input Screen          120
  210.                   Runtime Auto Start            133
  211.                   Set System Values             139
  212.                   Tabulation                    152
  213.                   Totals & Sub Totals           159
  214. ................................................................................
  215.  
  216.  
  217.  
  218.       ABS                        FUNCTION                         ABS
  219.  
  220.  
  221.       This function returns the absolute (positive) value of a
  222.       number.
  223.  
  224.       Ex. abs(length - breadth)
  225.          This returns 6 if length = 12 and breadth = 6
  226.          or if length = 6 and breadth = 12
  227.  
  228.  
  229.       Acceptable parameters
  230.  
  231.       Numeric value
  232.       Numeric expression
  233.       Numeric field/variable
  234.       Any function which returns a numeric value
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.                                 - 1 -
  275. ................................................................................
  276.  
  277.  
  278.  
  279.       ADDRESS LABELS              METHOD               ADDRESS LABELS
  280.  
  281.  
  282.       The following procedure prints two columns of address labels
  283.       from a "Addr" form.
  284.  
  285.       .......................Procedure code................
  286.  
  287.       Declare output fields
  288.          Addr.name : Addr.street : Addr.town : Addr.pcode
  289.          Lname : Lstreet : Ltown : Lpcode
  290.       end
  291.       for Addr
  292.          if Lname = blank then
  293.             Lname = Addr.name : Lstreet = Addrstreet
  294.             Ltown = Addr.town : Lpcode = Addrpcode
  295.          else
  296.             print list items
  297.             Lname = blank : Lstreet = blank
  298.             Ltown = Blank : Lpcode  = blank
  299.          end if
  300.       next
  301.       if Lname <> blank then print list items
  302.  
  303.       ....................Output Format........................
  304.  
  305.       .List Items
  306.  
  307.            {Lname field        }       {Addr.name field    }
  308.            {Lstreet field      }       {Addr.street field  }
  309.            {Ltown field        }       {Addr.town field    }
  310.            {Lpcode field       }       {Addr.pcode field   }
  311.  
  312.       .end
  313.  
  314.  
  315.       The field positioning and the distance between the .List Items
  316.       and .end can be adjusted to fit the label paper.
  317.  
  318.  
  319.       If your label paper has three columns then you could use the
  320.       following procedure.
  321.  
  322.       declare output fields
  323.          Addr.name : Addr.street : Addr.town : Addr.pcode
  324.          Mname : Mstreet : Mtown : Mpcode
  325.          Lname : Lstreet : Ltown : Lpcode
  326.       end
  327.       declare variables
  328.          x as number
  329.       end
  330.  
  331.       Continued.
  332.  
  333.  
  334.  
  335.                                 - 2 -
  336. ................................................................................
  337.  
  338.  
  339.  
  340.       ADDRESS LABELS              METHOD               ADDRESS LABELS
  341.  
  342.  
  343.       for addr
  344.          x = x + 1
  345.          if Mod(x,3) = 1 then
  346.             Lname = Addr.name : Lstreet = Addr.street
  347.             Ltown = Addr.town : Lpcode = Addr.pcode
  348.          end if
  349.          if Mod(x,3) = 2 then
  350.             Mname = Addr.name : Mstreet = Addr.street
  351.             Mtown = Addr.town : Mpcode = Addr.pcode
  352.          end if
  353.          if Mod(x,3) = 0 then
  354.             Print list items
  355.             Lname = Blank : Lstreet = blank
  356.             Ltown = blank : Lpcode = Blank
  357.             Mname = Blank : Mstreet = blank
  358.             Mtown = blank : Mpcode = Blank
  359.          end if
  360.       next
  361.       If Lname <> blank then print list items
  362.  
  363.  
  364.       .........................output format...................
  365.  
  366.  
  367.       .list items
  368.  
  369.          { Lname       }    { Mname       }   { Addr.name   }
  370.          { Lstreet     }    { Mstreet     }   { Addr.street }
  371.          { Ltown       }    { Mtown       }   { Addr.town   }
  372.          { Lpcode      }    { Mpcode      }   { Addr.pcode  }
  373.  
  374.       .end
  375.  
  376.  
  377.  
  378.       See Also:- Form Letters
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.                                 - 3 -
  397. ................................................................................
  398.  
  399.  
  400.  
  401.       ALTER VAT RATES            UTILITY              ALTER VAT RATES
  402.  
  403.  
  404.       The five VAT rates used by the VAT functions can be altered
  405.       either from the utilities menu or from a user menu function.
  406.       Just select "Alter VAT rates" - edit the percentages and press
  407.       F2 to save the new values.
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.                                 - 4 -
  458. ................................................................................
  459.  
  460.  
  461.  
  462.       AUTODIAL               DERIVATION PREFIX               AUTODIAL
  463.  
  464.  
  465.       Easy Base will dial (via a Hayes compatible modem) direct from
  466.       any form or procedure input screen.
  467.  
  468.       To use the Auto dialling facility, all you have to do is place
  469.       the "autodial" keyword in the derivation of the field which
  470.       contains the telephone number. If the field already has a
  471.       derivation then add "autodial" as a prefix.
  472.  
  473.       Ex. Autodial Lookup(customers,phone)
  474.  
  475.       To initiate the call type Ctrl + D.
  476.  
  477.       By default Easy Base uses tone dialling via COM1. If your modem
  478.       is connected to COM2 you can set this up from the Options item
  479.       on the Utilities menu.
  480.  
  481.       If your exchange does not recognize tone dialling then you can
  482.       pulse dial by pressing Ctrl + P.
  483.  
  484.       If you operate from a private exchange and have to wait for an
  485.       outside line after dialling 9 then place a "W" between the 9
  486.       and the rest of the number.
  487.  
  488.  
  489.       Note:-
  490.  
  491.       1.   You can only have one derivation prefix on any one field.
  492.  
  493.       2.   The Autodial prefix cannot be tested in derivation test
  494.            mode.
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.                                 - 5 -
  519. ................................................................................
  520.  
  521.  
  522.  
  523.       BACKUP APPLICATION         UTILITY           BACKUP APPLICATION
  524.  
  525.  
  526.       Easy Base includes an inbuilt Backup system for your
  527.       applications and data.
  528.  
  529.       If you select "Backup Application" from the utilities menu then
  530.       Easy Base will backup your entire application - Choicelist
  531.       fields - Forms - Data and procedures. The backup system will
  532.       split large files across multiple disks automatically.
  533.  
  534.       When an application is finished and you have backup copies then
  535.       backing up choice lists and procedures is wasteful of time and
  536.       floppies. You can backup only the users data by calling "Backup
  537.       Data" from a user menu.
  538.  
  539.       Backup Principles.
  540.  
  541.       The reason for a backup is that in the event of a computer or
  542.       hard disk failure you will have your application or data to
  543.       restore on the new machine.
  544.  
  545.  
  546.       If you have no backup and your machine fails then you have lost
  547.       all your data. If you have only one backup and your machine
  548.       fails while doing a backup then you have lost all your data.
  549.  
  550.       The principle of safe backing up is to keep two sets of backup
  551.       disks in separate boxes marked "Latest" and "Previous".
  552.       Whenever you do a backup you use the disks from the "Previous"
  553.       box - move the disks from the "Latest" to the "Previous" and
  554.       put your new backups in the latest box when completed.
  555.  
  556.       This not only overcomes the problem of a failure during backup
  557.       but also provides a secondary set of disks if any of the
  558.       "Latest" disks turn out to be faulty when you come to restore.
  559.  
  560.       If you ever have to use a backup disk and find that it has
  561.       developed a bad sector then you can attempt a recovery with a
  562.       utility such as "Norton" Disk Test. Easy Base leaves
  563.       approximately 5K of unused disk space on all backup disks so
  564.       that such a utility has somewhere to move bad sectors to.
  565.  
  566.       To save disk space, Easy Base does not backup index files. If
  567.       you ever have to use a backup disk then the index files are
  568.       rebuilt after restoring the data.
  569.  
  570.  
  571.       See Also:-  Restore
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.                                 - 6 -
  580. ................................................................................
  581.  
  582.  
  583.  
  584.       BEEP                     FIELD CONTROL                     BEEP
  585.  
  586.  
  587.       The "beep" control is used in field derivations to alert the
  588.       user to input errors. In addition to sounding the beeper the
  589.       "beep" control has two optional additional parts - A message to
  590.       be sent to the message line and cursor redirection. This is
  591.       normally to the field in which the error has been made but can
  592.       be to any field.  Field controls are appended to field
  593.       derivations and are enclosed in square brackets.
  594.  
  595.       Ex.  If(partno < 0,blank[beepPart Numbers must not be
  596.       negativeCursor partno],partno)
  597.  
  598.       In this example, if the user enters a negative number in the
  599.       partno field the computer will beep,the number will be cleared
  600.       from the field, the message "Part Numbers must not be negative"
  601.       will be displayed on the message line and the cursor will
  602.       return to the "partno" field.
  603.  
  604.       Ex. If(paid = "no" and chequeno <> blank,paid[beepEither bill
  605.       has been paid or cheque number entered in errorCursor
  606.       paid],paid)
  607.  
  608.       In Easy Base, division by zero is not trapped as an error.
  609.       There is a very good reason for this.  When you start a new
  610.       record and all the fields are blank then any field which
  611.       provides a value for a division in another field would cause a
  612.       division by zero error before its value had been entered.
  613.  
  614.       Whenever Easy Base encounters a division by Zero it divides by
  615.       one instead.  This is perfectly acceptable in most business
  616.       applications.  However, if you need to be warned of a division
  617.       by zero in formulae then you can provide your own error trap
  618.       using the "Beep" control.
  619.  
  620.       Ex.
  621.  
  622.          If( T4 = 0,blank[beepDivision by Zero Value from Field T4],
  623.                       T4)
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.                                 - 7 -
  641. ................................................................................
  642.  
  643.  
  644.  
  645.       BLANK.                   SYSTEM VALUE                    BLANK.
  646.  
  647.  
  648.       In Easy Base the value of any field which does not contain
  649.       characters is represented by the word "Blank" irrelevant of
  650.       data type.
  651.  
  652.       A numeric field returns the value "Blank" only when the field
  653.       is empty. If it has a value of zero then it is NOT blank.  In
  654.       fact, the main advantage of recognizing "Blank" is that you can
  655.       distinguish between zero value and empty numeric fields.
  656.  
  657.       There is, however, one slight disadvantage.  If a text field
  658.       contains ONLY the word blank and you use its value in a
  659.       derivation then the word "Blank" from the field will disappear.
  660.  
  661.       The "Name" field at the top left hand side of this page is
  662.       derived by the formula Upper(Name).  You will notice that
  663.       "Blank" is followed by a full stop.  If it were not then the
  664.       upper function would return "                    ".
  665.  
  666.       You can also remove a fields contents by setting it equal to
  667.       blank.
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.                                 - 8 -
  702. ................................................................................
  703.  
  704.  
  705.  
  706.       BOTTOM MARGIN            SYSTEM VALUE             BOTTOM MARGIN
  707.  
  708.  
  709.       Throughout a procedure which has a printed output, Easy base
  710.       keeps track of the length of page remaining (in inches) in the
  711.       system value "Bottom Margin". The Bottom margin value is used
  712.       to control pagination in procedures which "Report" on data.
  713.  
  714.       The "Bottom Margin" value is based on the paper type entered
  715.       from the Utilities Menu. You must set the type of paper you are
  716.       using before using "Bottom Margin".
  717.  
  718.       Ex.
  719.       Line feed: Line feed: Line feed
  720.       For employees
  721.          print list items
  722.          if bottom margin < .5 then
  723.             page feed: line feed :line feed : line feed
  724.          else
  725.             line feed
  726.          end if
  727.       next
  728.  
  729.       In the above example the list items section is printed with a
  730.       blank line between each and with a half inch top and bottom
  731.       page margin.
  732.  
  733.       When you base decisions on the "Bottom margin" value you should
  734.       always do so with a "Greater Than" or "Less Than" operator. If
  735.       you used " If Bottom margin = .5 then Page feed" your page
  736.       would only be ejected if and when the "Bottom Margin" value was
  737.       exactly 0.5  As most printing is done at six lines to the inch
  738.       it is most unlikely that the "Bottom margin" value would ever
  739.       be half an inch.
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.                                 - 9 -
  763. ................................................................................
  764.  
  765.  
  766.  
  767.       BYPASS SIGN-ON SREEN        METHOD         BYPASS SIGN-ON SREEN
  768.  
  769.  
  770.       You can bypass the sign-on screen for both the developers
  771.       password and any User-menu password by adding the sub directory
  772.       and password to the start up command line. This is particularly
  773.       useful in finished applications as the application can be
  774.       called directly from a hard disk menu system - the sign on
  775.       screen will not appear and the application will start as if it
  776.       were a stand alone program.
  777.  
  778.       To start an application in the accounts sub directory whos
  779.       start up menu password is "start" use the command line:
  780.  
  781.       EB accounts/start
  782.  
  783.       If you have several applications in different sub directories
  784.       all with the same password you can skip entering the password
  785.       but still choose the sub directory by using the command line:
  786.  
  787.       EB password
  788.  
  789.       See also Runtime Autostart
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.                                 - 10 -
  824. ................................................................................
  825.  
  826.  
  827.  
  828.       CHANGE PASSWORD            UTILITY              CHANGE PASSWORD
  829.  
  830.  
  831.       You can change your developers access password with this item
  832.       on the utilities menu.
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.                                 - 11 -
  885. ................................................................................
  886.  
  887.  
  888.  
  889.       CHOICE                    FIELD TYPE                     CHOICE
  890.  
  891.  
  892.       If you define a field as the "Choice" type a window will open
  893.       into which you can type up to seventeen different choices.
  894.       When you have entered your choices you will be asked to give a
  895.       name to your choice list. Once a choice list has been saved it
  896.       can be used in any other choice field in any other form or
  897.       input screen.
  898.  
  899.       Once a choice list has been saved you can edit the contents but
  900.       not the field length. Editing a choice list in one form
  901.       automatically edits it for any other form.
  902.  
  903.       If you need to alter a list such that the field length will
  904.       change then you must create a new list. You can erase the old
  905.       one from the utilities menu.  If the list is used in more than
  906.       one form then you must redefine it in all the other forms in
  907.       which it is used
  908.  
  909.       When the cursor enters a choice field your choice list will be
  910.       displayed for the user to choose from. He cannot enter any
  911.       value other than one from the list.
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.                                 - 12 -
  946. ................................................................................
  947.  
  948.  
  949.  
  950.       CHR$                       FUNCTION                        CHR$
  951.  
  952.  
  953.       The Chr$ function returns the character whose ASCII number is
  954.       supplied as the parameter.
  955.  
  956.       Ex.   Chr$(171)
  957.             < Returns "½">
  958.  
  959.       Ex.   Jointext(Chr$(227),"r",Chr$(253))
  960.             < Returns "πr²"
  961.  
  962.       In Easy Base, text fields are automatically justified left.
  963.       This is desirable in record entry as it prevents the user from
  964.       entering leading spaces in indexed fields and consequently
  965.       trashing alphabetic printouts. However, you may wish to right
  966.       justify or centre justify text in printouts. For example, the
  967.       righthand "Chr$" at the top of this page is right justified in
  968.       its field. You can use the ASCII character 255 to achieve right
  969.       or centre justification.
  970.  
  971.       Ex.
  972.  
  973.       Heading = jointext(stringof((30-lengthtext(name))/2,Chr$(255)),
  974.       name)
  975.           < This centres name in the 30 character field "heading">
  976.  
  977.       Ex.
  978.  
  979.       Heading =Jointext(stringof(40-lengthtext(name),Chr$(255)),name)
  980.  
  981.          < This right justifies name in a 40 character field
  982.            "Heading">
  983.  
  984.  
  985.       CAUTION:
  986.  
  987.       You can produce any ASCII character ( 0 - 255 ) with the Chr$
  988.       function. ASCII characters 0 to 31 are used as printer controls
  989.       and although you can use them freely on screen you should never
  990.       include them in a procedure output which will be sent to the
  991.       printer.
  992.  
  993.       The ASCII character 127 is used internally by Easy Base to
  994.       replace quotation marks within quoted text. It should not be
  995.       used for any other purpose.
  996.  
  997.       Acceptable parameters:
  998.  
  999.       Numeric value, field, variable, expression or function
  1000.       returning a number between 0 and 255
  1001.  
  1002.  
  1003.  
  1004.  
  1005.  
  1006.                                 - 13 -
  1007. ................................................................................
  1008.  
  1009.  
  1010.  
  1011.       CLEAR RECORDS FROM     PROCEDURE COMMAND     CLEAR RECORDS FROM
  1012.  
  1013.  
  1014.       The "Clear Records From" command clears all records from a form
  1015.       by erasing its data and index files. If you need to erase all
  1016.       records form a form always use the "Clear Records" command
  1017.       rather than "Delete Record" command. It is much faster and does
  1018.       not require the form to be re-packed afterward.
  1019.  
  1020.       Ex.
  1021.  
  1022.       If input.confirm = "yes" then clear records from invoices
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.                                 - 14 -
  1068. ................................................................................
  1069.  
  1070.  
  1071.  
  1072.       CLEARFIELDS              FIELD CONTROL              CLEARFIELDS
  1073.  
  1074.  
  1075.       The "Clearfields" control blanks out all other fields on a form
  1076.       or procedure input screen whenever the field containing the
  1077.       control is changed.
  1078.  
  1079.       The primary use for the "Clearfields" control is to force
  1080.       default lookups to re-derive for procedures which edit data.
  1081.  
  1082.       For Example - If you wrote a procedure to alter customers
  1083.       addresses and telephone numbers then you would have three
  1084.       fields on the input screen.
  1085.  
  1086.       Accountno   derived   lookup(customers,accountno)
  1087.  
  1088.       address     derived   default(lookup(customers,address))
  1089.  
  1090.       Tel         derived   default(lookup(customers,tel))
  1091.  
  1092.       When you enter a customers account number, his old address and
  1093.       telephone number will be looked up, but the "Default" function
  1094.       will allow you to edit them. The procedure code would then
  1095.       update the record with the new address and phone number.
  1096.  
  1097.       The problem is, that having entered an account number and
  1098.       looked up the other fields, if you then realize you have
  1099.       entered the wrong account number and change it, the other
  1100.       fields will not re-derive because they now have a default
  1101.       value.  To get them to lookup based on the new account number
  1102.       you would have to take the cursor to each field and clear it
  1103.       with the F6 key.
  1104.  
  1105.       you can automate this process by adding the "Clearfields"
  1106.       control to the accountno derivation:-
  1107.  
  1108.       lookup(customers,accountno)[clearfields]
  1109.  
  1110.  
  1111.       Note:  The "Clearfields" control will only work when appended
  1112.       to a derivation which is already dependent on the value of the
  1113.       field. If you want to clear fields based on a change to a field
  1114.       which has no other derivation then you must derive the field
  1115.       with its own name plus the "Clearfields" control.
  1116.  
  1117.       In a field "Number" the derivation - Number[clearfields] - will
  1118.       clear all other fields when the "Number" field is edited but
  1119.       the derivation [clearfields] will have no effect.
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.                                 - 15 -
  1129. ................................................................................
  1130.  
  1131.  
  1132.  
  1133.       Close                    File Command                     Close
  1134.  
  1135.  
  1136.       The "Close" command closes a non Easy Base file which has been
  1137.       opened with the "Open" command.
  1138.  
  1139.       If a procedure only opens a single external file then the close
  1140.       command can be ommitted, but if several files are opened within
  1141.       a procedure then each must be closed before the next is opened.
  1142.       You can only have one external file open at any one time.
  1143.  
  1144.       ....................
  1145.       declare output fields
  1146.          Files : Path
  1147.       end
  1148.       declare variables
  1149.         Ln as text
  1150.       end
  1151.       Open  "C:\CONFIG.SYS"
  1152.       do
  1153.          Read line to Ln
  1154.          if lefttext(Ln,6) = "files=" then exit do
  1155.       Loop
  1156.       Files = Ln
  1157.       Close
  1158.       Open "C:\AUTOEXEC.BAT"
  1159.       Do
  1160.          read line to Ln
  1161.          if Lefttext(Ln,4) = "path" then exit do
  1162.       Loop
  1163.       Close
  1164.       Path = Ln
  1165.       Print List Items
  1166.  
  1167.  
  1168.       See also: Open, Seek, Read, Write, Find, Erase
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.                                 - 16 -
  1190. ................................................................................
  1191.  
  1192.  
  1193.  
  1194.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1195.  
  1196.  
  1197.       If you need to list records from a form in such a way that they
  1198.       are grouped by one field but with each record in the group
  1199.       ordered by another then you can either use a compound index
  1200.       field or "Subindex" the group during the procedure.
  1201.  
  1202.       A compound index field is simply an additional field in which
  1203.       the contents of two or more fields are compounded using the
  1204.       "Jointext" function. The field is indexed and the index on that
  1205.       field can then be used to select records with the desired group
  1206.       ordering.
  1207.  
  1208.       For example:- A "Videos" form has fields for "Title",
  1209.       "RentalPrice" and "Category".
  1210.  
  1211.       To list the records grouped by "Category" but with the "Titles"
  1212.       in each category in alphabetic order you add another field to
  1213.       the form which is Text, Indexed and long enough to hold the
  1214.       contents of both the "category" and "Title" fields. The field
  1215.       is derived by joining the text of the "Category" and "Title"
  1216.       fields.
  1217.  
  1218.       There are a couple of minor complications in creating compound
  1219.       index fields. Firstly the "Jointext" function by default strips
  1220.       any trailing space characters from the text it is joining. If a
  1221.       straight "Jointext" function was used and the first two videos
  1222.       entered were "A Bridge Too Far" and "Snow White" then the
  1223.       compound fields would derive as:-
  1224.  
  1225.       "WarA Bridge Too Far"  and
  1226.       "CartoonSnow White"
  1227.  
  1228.       When what you need is:-
  1229.  
  1230.       "War      A Bridge Too Far"  and
  1231.       "Cartoon  Snow White      "
  1232.  
  1233.       To produce the desired spacing in the compound field use the
  1234.       "Spacepad" function.
  1235.  
  1236.       If the length of the "Category" field is 15 then derive the
  1237.       compound field with - Jointext(spacepad(category,15),title)
  1238.  
  1239.       If you are compounding more than two fields then "spacepad" all
  1240.       the fields being joined to their own field's length except the
  1241.       last one.
  1242.  
  1243.       The maximum length of a text field in Easy Base is 80
  1244.       characters. If the fields you need to compound total more than
  1245.       80 then you must reduce the length of the field names. Compound
  1246.       indices in Text Block fields should not be used.
  1247.  
  1248.  
  1249.  
  1250.                                 - 17 -
  1251. ................................................................................
  1252.  
  1253.  
  1254.  
  1255.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1256.  
  1257.  
  1258.       Once you have created a compound field and checked that it
  1259.       derives correctly it is normal to define it as invisible and no
  1260.       entry anyway as it is not its contents that are of interest but
  1261.       the order which its index produces.
  1262.  
  1263.       Ex.   Assuming the compound field was called "catgroup"
  1264.  
  1265.       ..........................code..................
  1266.       for videos with catgroup in order
  1267.          print list items
  1268.       next
  1269.       ........................format.................
  1270.       .List Items
  1271.             {Videos.Category Field}     {Videos.Title Field}
  1272.       .End
  1273.  
  1274.  
  1275.       Ex.
  1276.  
  1277.  
  1278.       ...........................code....................
  1279.       declare variables
  1280.          catcheck as text
  1281.       end
  1282.       for videos with catgroup in order
  1283.          if catcheck <> videos,category then print group header
  1284.          catcheck = videos.category
  1285.          print list items
  1286.       next
  1287.       ..........................format...............
  1288.       .Group Header
  1289.          -------------------------------------
  1290.          Films categorized as {category field}
  1291.          -------------------------------------
  1292.       .List Items
  1293.                     {Title field}
  1294.       .End
  1295.  
  1296.       There is yet a further complication if one or more of the
  1297.       fields to be compounded is numeric. Easy Base index files are
  1298.       sorted alphabetically if the field is text and numerically if
  1299.       the field is numeric. A compound field is always text so if you
  1300.       need to compound a numeric field you have to ensure that it
  1301.       will sort alphabetically to the same order that it sorts
  1302.       numerically. The text of numeric values sort alphabetically to
  1303.       the same order as their values only if they all have the same
  1304.       number of digits either side of the decimal point.
  1305.  
  1306.       6  12 and 34 sort alphabetically as 12  34  6
  1307.       but
  1308.       06 12 and 34 sort alphabetically as 06  12  34
  1309.  
  1310.  
  1311.                                 - 18 -
  1312. ................................................................................
  1313.  
  1314.  
  1315.  
  1316.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1317.  
  1318.  
  1319.       Easy Base provides the function "Zeropad" to pad numbers to the
  1320.       same length for compounding.  The "Zeropad" function has three
  1321.       parameters - The number to be padded, the number of digits left
  1322.       of the decimal to pad to and the number of digits right of the
  1323.       decimal to pad to. All three parameters must be supplied. If
  1324.       the number is an integer then the third parameter is 0.
  1325.  
  1326.       Ex. To list the "Videos" records grouped by rental price with
  1327.       the titles in each price group in order you would create a
  1328.       compound field derived with:-
  1329.  
  1330.       Jointext(zeropad(rentalprice,2,2),title)
  1331.  
  1332.       Ex.
  1333.  
  1334.       A "Ships" form has fields for "Type" and "Displacement"
  1335.  
  1336.       To list the ships grouped by type with the Displacement in each
  1337.       group in order you would create a compound field derived with:-
  1338.  
  1339.       jointext(spacepad(type,15),zeropad(displacement,8,0))
  1340.  
  1341.       In many cases where you wish to compound a mixture of text and
  1342.       numeric fields you will require the numeric values to be listed
  1343.       in descending order while the text value is to be in alphabetic
  1344.       order.
  1345.  
  1346.       In the above example for ships, had you wished each group to
  1347.       be listed with "Displacement" in descending order you would
  1348.       derive the compound field as:-
  1349.  
  1350.       jointext(spacepad(type,15),reverse(zeropad(displacement,8,0)))
  1351.  
  1352.       The "Reverse" function simply inverts the ACSII number of each
  1353.       character in its parameter so that it will sort in reverse
  1354.       order in the index file.
  1355.  
  1356.       The "Reverse" function works equally well on text values
  1357.       although reverse alphabetic lists are seldom required.
  1358.  
  1359.       The "Zeropad" function will only pad out a number to the size
  1360.       required. It will not trim the number if it is already longer
  1361.       than one of the pad lengths. You should not therefore create
  1362.       compound fields with Floating Point numbers.
  1363.  
  1364.       If you compound a date or time field you should zeropad it to
  1365.       5,0 as the text which will be used is actually the date or time
  1366.       fields numeric value.
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.                                 - 19 -
  1373. ................................................................................
  1374.  
  1375.  
  1376.  
  1377.       COMPOUND LOOKUPS            METHOD             COMPOUND LOOKUPS
  1378.  
  1379.  
  1380.       Occasionally, in an input screen, you will wish to lookup
  1381.       details from a form whose unique field is a compound of two
  1382.       others.  As an example, if you wished to lookup details from
  1383.       the "Userlist" form, mentioned in the manual, then you would
  1384.       have to base the lookups on a relationship between a field on
  1385.       the input screen and the "UNI" field in "Userlist". The "UNI"
  1386.       field in userlist is a combination of the "Aircraft" forms
  1387.       "Knownas" field and the "Airlines" form "Name" field.
  1388.  
  1389.       Although you could simply use a field "UNI" on the input screen
  1390.       and derive it :- Lookup(userlist,uni) - this would mean that
  1391.       the end user would have to enter the whole of the aircraft
  1392.       Knownas part plus part of the airlines name part plus the "*"
  1393.       in order to get the lookup.
  1394.  
  1395.       This would not only be awkward to use but would also entail
  1396.       explaining compound fields to the end user.
  1397.  
  1398.       You can avoid this situation by providing two fields, one in
  1399.       which the user looks up the aircraft knownas field and one in
  1400.       which he looks up the airline name. These are based on separate
  1401.       relationships between the input screen and the "Aircraft" and
  1402.       "Airlines" forms.
  1403.  
  1404.       The input screen's "UNI" field can now be made invisible with
  1405.       no user entry and derived:- Jointext(knownas,name).
  1406.  
  1407.       A relationship is entered between the input screen and the
  1408.       "Userlist" form linking the "UNI" fields and all the required
  1409.       details can then be derived :- lookup(userlist,whatever).
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.                                 - 20 -
  1434. ................................................................................
  1435.  
  1436.  
  1437.  
  1438.       COPY ALL FROM          PROCEDURE COMMAND          COPY ALL FROM
  1439.  
  1440.  
  1441.       When you are transferring values from the fields of one form to
  1442.       the fields of another in preparation for a "New Record" or
  1443.       "Update Record"  you can use "Copy All From" to save time.
  1444.  
  1445.       Ex.
  1446.  
  1447.       for invoiceitems new record
  1448.          invoiceitems.item = input.item
  1449.          invoiceitems.price = input.price
  1450.          invoiceitems.quantity = input.quantity
  1451.          invoiceitems.vatrate = input.vatrate
  1452.       next
  1453.  
  1454.       can be replaced with:-
  1455.  
  1456.       for invoiceitems new record
  1457.          copy all from input
  1458.       next
  1459.  
  1460.       The data transfer in a "Copy All From" is based on the source
  1461.       and destination fields having the same name.
  1462.  
  1463.       If the source and destination fields have different data types
  1464.       Easy Base will attempt a conversion.
  1465.  
  1466.       The conversion will succeed between different numeric types and
  1467.       from numeric to text. It will fail from text to numeric and
  1468.       between any mismatch of date and time.
  1469.  
  1470.  
  1471.  
  1472.  
  1473.       See also:-  Derive Off, Duplicate Prevention
  1474.  
  1475.  
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.                                 - 21 -
  1495. ................................................................................
  1496.  
  1497.  
  1498.  
  1499.       CORRECTING STATS.           METHOD            CORRECTING STATS.
  1500.  
  1501.  
  1502.       If you write an application in which records are entered via
  1503.       procedures and "running" statistics are kept, you will have to
  1504.       provide procedures which allow the user to correct any mistakes
  1505.       he has made.
  1506.  
  1507.       For Example: - In a "Time Sheets" application the user enters a
  1508.       time and customer on the input screen of a procedure. The
  1509.       procedure then calculates the charge, writes the charge and
  1510.       customers name to the "Timesheet" form, adds the charge to the
  1511.       "Balance" field in the "Customers" form and also adds it to the
  1512.       "Total" field in the "Workinhand" form.
  1513.  
  1514.       If the operator makes an error then correcting the entry in the
  1515.       "Timesheet" form is simply a case of updating it but to correct
  1516.       the "Balance" and "Total" fields you must add the corrected
  1517.       value and subtract the old incorrect value.
  1518.  
  1519.       To get the two values together for your procedure, create an
  1520.       input screen where the operator enters the "line" ("line" is
  1521.       the unique sequenced field in "Timesheet").  Then create two
  1522.       fields for the values. The first, "oldval" is derived
  1523.       lookup(timesheet,charge) and the second, "newval" is derived
  1524.       default(lookup(timesheet,charge).
  1525.  
  1526.       The "Oldval" field can be invisible and has no user entry.
  1527.  
  1528.       You would also add two similarly derived fields "Oldcustomer"
  1529.       and "Newcustomer".
  1530.  
  1531.       When the user edits the "Newval" and/or "Newcustomer" field and
  1532.       presses F2 , all the required values are available to the
  1533.       procedure code:-
  1534.  
  1535.       pause off : escape off
  1536.       for timesheet with line = input.line
  1537.          timesheet.charge = input.newval
  1538.          timesheet.customer = input.newcustomer
  1539.          update record
  1540.       next
  1541.       for customers with name = input.oldcustomer
  1542.          customers.balance = customers.balance - input.oldval
  1543.          update record
  1544.       next
  1545.       for customers with name = input.newcustomer
  1546.          customers.balance = customers.balance + input.newval
  1547.          update record
  1548.       next
  1549.       for workinhand
  1550.         workinhand.total = workinhand.total+input.newval-input.oldval
  1551.         update record
  1552.       next
  1553.  
  1554.  
  1555.                                 - 22 -
  1556. ................................................................................
  1557.  
  1558.  
  1559.  
  1560.       CREATE TEMP AS         PROCEDURE COMMAND         CREATE TEMP AS
  1561.  
  1562.  
  1563.       The "Create Temp As" command makes a temporary form during a
  1564.       procedure. There are two main uses for the temporary form.
  1565.  
  1566.       1.  To physically sort the records in a form.
  1567.  
  1568.       Ex.
  1569.  
  1570.       create temp as addresses
  1571.       index off:pause off:escape off:derive off
  1572.       for addresses with surname in order
  1573.          for temp new record
  1574.             copy all from addresses
  1575.          next
  1576.       next
  1577.       rename temp as addresses
  1578.  
  1579.       The other main use for the temporary file is to save time when
  1580.       the majority of records in a form are to be deleted.
  1581.  
  1582.       Ex.
  1583.       A purchases ledger form is to be cleared down at the year end
  1584.       but any unreconciled payment entries are to be retained and
  1585.       flagged as last years. If there were 15000 records in the form
  1586.       of which only 50 were unreconciled then the procedure
  1587.  
  1588.       for purchases
  1589.          if purchases.reconciled = "yes" then
  1590.             delete record
  1591.          else
  1592.             purchases.lastyear = "yes"
  1593.             update record
  1594.          end if
  1595.       next
  1596.  
  1597.       would not only take a very long time to run but would leave the
  1598.       form full of deleted records and it would have to be re-packed.
  1599.  
  1600.       The same result can be achieved very quickly and without the
  1601.       need to re-pack with the following procedure.
  1602.  
  1603.       create temp as purchases
  1604.       for purchases with reconciled = "no"
  1605.          for temp new record
  1606.             copy all from purchases
  1607.             temp.lastyear = "yes"
  1608.          next
  1609.       next
  1610.       rename temp as purchases
  1611.  
  1612.       Do not use the "Clear Records" command to wipe the old file
  1613.       before using "Rename Temp As".  If you suffered a power failure
  1614.       after clearing and before renaming you would lose your data.
  1615.  
  1616.                                 - 23 -
  1617. ................................................................................
  1618.  
  1619.  
  1620.  
  1621.       CREATING RUNTIME            METHOD             CREATING RUNTIME
  1622.  
  1623.  
  1624.       To create a distributable application with the Easy Base
  1625.       Royalty free Runtime Module, first, ensure that your
  1626.       application has a user menu with a start up password. If you
  1627.       wish your runtime application to start without a sign on screen
  1628.       then this password should be "Autostart".
  1629.  
  1630.       Make a new directory for your module and copy all the files
  1631.       from the Easy Base sub directory in which you developed the
  1632.       application to it.
  1633.  
  1634.       Copy the Configuration file "EB.SET" from your Easy Base
  1635.       directory to this directory.
  1636.  
  1637.       Insert the Runtime Module disk in a floppy drive. Change to
  1638.       that drive and type "MODULE".
  1639.  
  1640.       The "Module" program will first ask you for the path to the
  1641.       application files. Once you enter this it will unpack the
  1642.       runtime files into your new directory.
  1643.  
  1644.       It will then ask for the name of your application. The name you
  1645.       supply here will be displayed on any sign on screens and also
  1646.       on the shutdown "Thank you for using - " line.
  1647.  
  1648.       It will then ask you for your copyright line. The text you
  1649.       enter here will replace the line "Application of Easy Base -
  1650.       Not for Resale" which appears above your menus.
  1651.  
  1652.       Finally, you will be asked for the Executable file name you
  1653.       wish to use for your program.
  1654.  
  1655.       When you have entered the details - Press F2 and your
  1656.       application will be complete and ready to sell.
  1657.  
  1658.                       --------------------------
  1659.  
  1660.       EASY INSTALL UTILITY
  1661.  
  1662.       For professional distribution disks just like the ones Easy
  1663.       Software is distributed on, you can purchase Easy Install.
  1664.       This utility will compress your application and create a
  1665.       distribution disk with an install program customized for your
  1666.       application.
  1667.  
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673.  
  1674.  
  1675.  
  1676.  
  1677.                                 - 24 -
  1678. ................................................................................
  1679.  
  1680.  
  1681.  
  1682.       CURRENT                DERIVATION PREFIX                CURRENT
  1683.  
  1684.  
  1685.       In Easy Base, fields are not normally derived when a previously
  1686.       entered record is viewed on screen. You can force a field to be
  1687.       rederived when viewed by prefixing the derivation with
  1688.       "current".
  1689.  
  1690.       Ex.  An invoice form has three fields Ivdate,Cdate and age.
  1691.  
  1692.       Ivdate is derived as   "system date"
  1693.       Cdate is derived as    "current system date"
  1694.       age is derived as      jointext(Cdate-Ivdate," Days old")
  1695.  
  1696.       Each time a record is viewed the Cdate field is rederived with
  1697.       the current system date and the age field shows the number of
  1698.       days since the record was filed.
  1699.  
  1700.       Ex.
  1701.  
  1702.       A form is used to price a certain job. It consists of fields
  1703.       for materials and their prices which are looked up from a
  1704.       "stock" form. If the primary lookup fields are prefixed with
  1705.       "current"   -  "current lookup(stock,item)"
  1706.  
  1707.       then each time a record is viewed it will reprice the job using
  1708.       the latest prices from the "stock" file.
  1709.  
  1710.       Please note that in the case of lookups, prefixing a secondary
  1711.       lookup has no effect. In the above example
  1712.  
  1713.         "current lookup(stock,price)"  would not work
  1714.  
  1715.       Provided that the primary lookup field is prefixed with
  1716.       "current" then any secondary lookups will also be rederived.
  1717.  
  1718.  
  1719.       The values of "Current" fields are also rederived whenever they
  1720.       are accessed in procedure code but they are NOT REDERIVED when
  1721.       they are accessed by a Lookup function.
  1722.  
  1723.  
  1724.       Note: You can only have one prefix on any one field derivation.
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.                                 - 25 -
  1739. ................................................................................
  1740.  
  1741.  
  1742.  
  1743.       CURRENT RECORD           SYSTEM VALUE            CURRENT RECORD
  1744.  
  1745.  
  1746.       Whenever a procedure is processing a "FOR" loop the number of
  1747.       the record being processed is available in the "Current Record"
  1748.       system value. The "Current Record" value is the records actual
  1749.       number in the form, not the number of records processed.
  1750.  
  1751.       Ex.
  1752.  
  1753.       for books with category = "fiction"
  1754.          count = count + 1
  1755.          Posn = current record
  1756.       next
  1757.  
  1758.       If the first book found with the category "fiction" is the
  1759.       fifteenth record in the file then count will return 1 and
  1760.       Posn will return 15.
  1761.  
  1762.  
  1763.       The "Current Record" value has no meaning in field derivations.
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.  
  1796.  
  1797.  
  1798.  
  1799.                                 - 26 -
  1800. ................................................................................
  1801.  
  1802.  
  1803.  
  1804.       CUSTOMIZE HELP LINE         METHOD          CUSTOMIZE HELP LINE
  1805.  
  1806.  
  1807.       You can replace the default help line (bottom line) in both
  1808.       data entry and procedure input screens.
  1809.  
  1810.       Press F6 in form or input screen design to access the help
  1811.       line.
  1812.  
  1813.       If you wish to revert to the default help line just erase your
  1814.       customized one.
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.                                 - 27 -
  1861. ................................................................................
  1862.  
  1863.  
  1864.  
  1865.       CYCLIC PROCEDURES           METHOD            CYCLIC PROCEDURES
  1866.  
  1867.  
  1868.       In many applications you will come across the situation where
  1869.       you need a procedure which will perform the same actions on a
  1870.       given set of records. For example, in a payroll system the
  1871.       procedure which calculates the employees wage and deductions
  1872.       has to be repeated for each employee so that their hours can be
  1873.       entered. If you simply enter each employees Worksno and lookup
  1874.       his or her details then it will be easy to miss an employee or
  1875.       to do one twice.
  1876.  
  1877.       To avoid this you can create a procedure which will cycle each
  1878.       employee through the input screen and terminate when all
  1879.       employees have been processed.
  1880.  
  1881.       On the employees form, add a field "Cycled" which is a single
  1882.       character indexed field derived :- Default("N").
  1883.  
  1884.       On the procedure input screen add an invisible field "Cycled"
  1885.       which is derived "N"
  1886.  
  1887.       You now enter two relationships between the procedure and the
  1888.       employees form. The main relationship "Employees" links the
  1889.       fields "Worksno" and the second, lets call it "Cycled" links
  1890.       the "Cycled" fields.
  1891.  
  1892.       On the input screen you derive the "Worksno" field as
  1893.       Lookup(cycled,worksno) and all the other details as
  1894.       lookup(employees,Whatever).
  1895.  
  1896.       When you run the procedure, the first employees details will be
  1897.       loaded automatically and all you have to enter are his hours.
  1898.  
  1899.       To have the next employee loaded after you run the procedure,
  1900.       the procedure code simply includes the lines:-
  1901.  
  1902.       for employees with worksno = input.worksno
  1903.          employees.cycled = "Y"
  1904.          update record
  1905.       next
  1906.  
  1907.       When all employees have been processed the "Worksno" field will
  1908.       derive blank as there are no employees with "N" in the "Cycled"
  1909.       field. You can therefore pass a "finished" message by altering
  1910.       the derivation of "Worksno" to :-
  1911.  
  1912.         if(lookup(cycled,worksno)=blank,blank[beepAll Employees have
  1913.         now been processed],lookup(cycled,worksno))
  1914.  
  1915.       To reset cycling for the next payroll you write an additional
  1916.       procedure with the code:-
  1917.       for employees
  1918.          employees.cycled = "N" : update record
  1919.       next
  1920.  
  1921.                                 - 28 -
  1922. ................................................................................
  1923.  
  1924.  
  1925.  
  1926.       Data Import                UTILITY                  Data Import
  1927.  
  1928.  
  1929.       There are four Data Import routines in Easy Base. The first
  1930.       imports data from files which conform to the Xbase standard
  1931.       first introduced by Dbase. The second imports data from "Comma
  1932.       Delimited" files. This is the standard used by most sequencial
  1933.       access and non relational data systems. The third routine
  1934.       imports data from fixed length record text files. This is the
  1935.       format which is used by all systems to output data. You can
  1936.       therefore import data from virtually any other system by first
  1937.       reporting on it to a disk file and then importing it with the
  1938.       fixed length ASCII import routine. The fourth routine imports
  1939.       one ASCII line per field.
  1940.  
  1941.       XBASE
  1942.  
  1943.       If the data you wish to import is in Xbase format, Easy Base
  1944.       will report the structure of the file. You can print this out
  1945.       by pressing F10. You now design a form to hold the imported
  1946.       data. The names that you give to the Easy Base fields do not
  1947.       have to be the same as the Xbase field names but they must be
  1948.       in the same order. If the Xbase fields are text then the Easy
  1949.       Base fields must be the same length. If the Xbase fields are
  1950.       numeric then the Easy Base fields must be numeric. It does not
  1951.       matter if they are different lengths and any of the three
  1952.       types, integer, fixed point or floating point can be used.
  1953.       If an Xbase field is a date field then it must be imported to
  1954.       an eight character text field in Easy Base. You can reformat it
  1955.       to an Easy Base date field after importation (See the Method -
  1956.       Data Type Conversion).  Easy Base does not support "Memo" data.
  1957.       If the Xbase file has a memo field you can still import from it
  1958.       but the memo field itself will be skipped by the import
  1959.       routine.
  1960.  
  1961.       COMMA DELIMITED
  1962.  
  1963.       To import data from comma delimited files all you have to do is
  1964.       design a form with the same number of fields as there are in
  1965.       the file to be imported. Numeric fields can be any of the three
  1966.       types and text fields should be long enough to hold the longest
  1967.       data expected in the incoming field. If any of the fields to be
  1968.       imported holds a date then it must be imported to a text field.
  1969.       You can convert it to a date later.
  1970.  
  1971.       FIXED LENGTH ASCII
  1972.  
  1973.       To import data from fixed length ASCII files you must design a
  1974.       form in which all fields are text and are exactly the same
  1975.       length and in the same order as the fields in the file to be
  1976.       imported. If the file to be imported has a header you can allow
  1977.       for this by entering the header length in bytes.
  1978.  
  1979.       If you are using the fixed length import routine to import data
  1980.       which you have output as a report from another system then
  1981.  
  1982.                                 - 29 -
  1983. ................................................................................
  1984.  
  1985.  
  1986.  
  1987.       Data Import                UTILITY                  Data Import
  1988.  
  1989.  
  1990.       please note the following points.
  1991.  
  1992.       The output report from the original system should have no
  1993.       headers, footers or left margin and there should be no spaces
  1994.       between fields.
  1995.  
  1996.       When the original system outputs the data it will add a
  1997.       carriage return and line feed sequence to the end of each
  1998.       record. When you design the form to import this data to, you
  1999.       must have a final two character text field to trap this
  2000.       sequence and maintain the same record length.  This field can
  2001.       be deleted after importation.
  2002.  
  2003.       All fields are imported as text. If any of them contain numeric
  2004.       values which you wish to convert to numeric fields you must do
  2005.       this after importation. (See Method Data Type Conversion)
  2006.  
  2007.       ASCII LINE
  2008.  
  2009.       The ASCII line import routine imports one line per field from
  2010.       an ASCII text file. If you have one field on the form to which
  2011.       you import then you will have one line per record. If you have
  2012.       two fields on the form to which you import then you will have
  2013.       two lines per record Etc.
  2014.  
  2015.       The import routines are for loading entire data files into Easy
  2016.       Base. For Flexible import and export to any part of any file
  2017.       see the External File Commands documentation.
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.                                 - 30 -
  2044. ................................................................................
  2045.  
  2046.  
  2047.  
  2048.       Data Type Conversion        METHOD         Data Type Conversion
  2049.  
  2050.  
  2051.       In Easy Base, modifying the structure of a data file after it
  2052.       contains data is very easy and flexible. If you select Modify
  2053.       Existing Form from the Forms menu you can add fields, delete
  2054.       fields, change field order, change field lengths and Easy Base
  2055.       will reformat your existing data automatically.
  2056.  
  2057.       You can NOT however change data types simply by changing the
  2058.       field type. If you change a field type and save the form you
  2059.       will almost certainly lose the data that was in that field.
  2060.       (Other than changing from one numeric type to another)
  2061.  
  2062.       If you work entirely within Easy Base there is no reason why
  2063.       you should ever need to change a field type. However, if you
  2064.       have imported data from Dbase or Fixed Length ASCII you may
  2065.       find yourself with numeric or date values held in text fields.
  2066.  
  2067.       The procedure for converting data from one type to another is
  2068.       as follows:-
  2069.  
  2070.       1.   Select Modify Existing Form
  2071.  
  2072.       2.   Add a new field of the desired type with a derivation
  2073.            formula such that it will derive its value from the field
  2074.            of the old type.
  2075.  
  2076.       3.   Save the form.
  2077.  
  2078.       4.   Select Modify the form again.
  2079.  
  2080.       5.   Cancel the derivation formula in the new field and delete
  2081.            the old field.
  2082.  
  2083.       6.   Re save the form.
  2084.  
  2085.  
  2086.       To derive a numeric field from a text field the derivation
  2087.       formula is simply the text field name.
  2088.  
  2089.       To derive a date field from a Dbase imported date in a text
  2090.       field called DT the formula is:-
  2091.  
  2092.       Makedate(midtext(DT,5,2),midtext(DT,7,2),midtext(DT,3,2))
  2093.  
  2094.       Version 3.10
  2095.  
  2096.       From V3.1 you can change field types between text and numeric
  2097.       and retain any numeric values that were in the field
  2098.       automatically . You still cannot change a field type from date
  2099.       or time to text or vice versa without following the above
  2100.       procedure.
  2101.  
  2102.  
  2103.  
  2104.                                 - 31 -
  2105. ................................................................................
  2106.  
  2107.  
  2108.  
  2109.       DATE                      FIELD TYPE                       DATE
  2110.  
  2111.  
  2112.       Date fields hold dates in the eight character format 11/11/94
  2113.  
  2114.       The assumed century runs from the first of January 1981 to the
  2115.       31st of december 2080.
  2116.  
  2117.       You can select whether you wish your dates to be displayed as
  2118.       day/month/year (European) or month/day/year (North American)
  2119.       from the "options" item on the utilities menu.
  2120.  
  2121.       You can perform addition and subtraction operations on date
  2122.       values in days.
  2123.  
  2124.       Ex.  System date + 30
  2125.  
  2126.       Arithmetic operations are only correct for the assumed century.
  2127.  
  2128.       Date fields are automatically checked for validity by the
  2129.       system.
  2130.  
  2131.       Easy base does not provide a ready made ten character date
  2132.       field but you can define one with the "Formatted Text" field
  2133.       type.
  2134.  
  2135.  
  2136.       See Also:-   Makedate
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155.  
  2156.  
  2157.  
  2158.  
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.                                 - 32 -
  2166. ................................................................................
  2167.  
  2168.  
  2169.  
  2170.       DATETEXT                   FUNCTION                    DATETEXT
  2171.  
  2172.  
  2173.       This function returns the date parameter in the form:-
  2174.  
  2175.       14th October 1994  or
  2176.       October 14th 1994  depending on the date format selected in
  2177.                          the utilities menu.
  2178.  
  2179.  
  2180.       Ex.    datetext(system date)
  2181.  
  2182.       Ex.    datetext(invoicedate + 30)
  2183.  
  2184.       Acceptable parameters:
  2185.  
  2186.       System date
  2187.       Date field
  2188.       Makedate function
  2189.       Date expression
  2190.  
  2191.  
  2192.  
  2193.  
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  
  2205.  
  2206.  
  2207.  
  2208.  
  2209.  
  2210.  
  2211.  
  2212.  
  2213.  
  2214.  
  2215.  
  2216.  
  2217.  
  2218.  
  2219.  
  2220.  
  2221.  
  2222.  
  2223.  
  2224.  
  2225.  
  2226.                                 - 33 -
  2227. ................................................................................
  2228.  
  2229.  
  2230.  
  2231.       DAYOFMONTH                 FUNCTION                  DAYOFMONTH
  2232.  
  2233.  
  2234.       This function returns the day no.(1-31) of the date parameter.
  2235.  
  2236.       Ex. dayofmonth(system date)
  2237.  
  2238.       Ex  dayofmonth(registered)
  2239.  
  2240.       Ex.
  2241.  
  2242.       if dayofmonth(system date) = 28 then
  2243.          for statements with settled = "No"
  2244.             statements.overdue = "Yes"
  2245.             update record
  2246.          next
  2247.       end if
  2248.  
  2249.       Acceptable parameters:
  2250.  
  2251.       System date
  2252.       Date field
  2253.       Makedate function
  2254.       Date expression
  2255.  
  2256.  
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.                                 - 34 -
  2288. ................................................................................
  2289.  
  2290.  
  2291.  
  2292.       DAYOFWEEK                  FUNCTION                   DAYOFWEEK
  2293.  
  2294.  
  2295.       This function returns the day no.(1-7) of the date parameter.
  2296.  
  2297.       Ex.  dayofweek(system date)
  2298.  
  2299.       Ex.  day = spellday(dayofweek(diary.date))
  2300.  
  2301.       Ex.  The following procedure, if called from a batch execute
  2302.       menu will only run on a Monday.
  2303.  
  2304.       declare output fields
  2305.          takings.date
  2306.          takings.dailytotal
  2307.       end
  2308.       if dayofweek(system date) = 1 then
  2309.          for takings with date in reverse order
  2310.             print list items
  2311.             if system date - takings.date > 7 then exit for
  2312.          next
  2313.       end if
  2314.  
  2315.       Acceptable parameters:
  2316.  
  2317.       System date
  2318.       Date field
  2319.       Makedate function
  2320.       Date expression
  2321.  
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.  
  2339.  
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.                                 - 35 -
  2349. ................................................................................
  2350.  
  2351.  
  2352.  
  2353.       DAYOFYEAR                  FUNCTION                   DAYOFYEAR
  2354.  
  2355.  
  2356.       This function returns the day no.(1-365) of the date parameter.
  2357.  
  2358.       Ex.   dayofyear(system date)
  2359.  
  2360.       Ex.   days = dayofyear(events.date)
  2361.  
  2362.       Acceptable parameters:
  2363.  
  2364.       System date
  2365.       Date field
  2366.       Makedate function
  2367.       Date expression
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399.  
  2400.  
  2401.  
  2402.  
  2403.  
  2404.  
  2405.  
  2406.  
  2407.  
  2408.  
  2409.                                 - 36 -
  2410. ................................................................................
  2411.  
  2412.  
  2413.  
  2414.       DECLARE                PROCEDURE COMMAND                DECLARE
  2415.  
  2416.  
  2417.       If you write a procedure which outputs information to the
  2418.       screen, printer or a disk file you must start it by declaring
  2419.       the output fields.
  2420.  
  2421.       Ex.
  2422.       Declare output fields
  2423.          Input.name
  2424.          Customers.name:customers.address:customers.acno
  2425.          countofinvoices
  2426.       end
  2427.  
  2428.       If fields you intend to print exist in a form then declare them
  2429.       as Formname.Fieldname.  Fields from the procedures Input Screen
  2430.       are declared as Input.fieldname. Easy Base will then use the
  2431.       field definitions from the form as defaults when you create the
  2432.       Output Format for the procedure.
  2433.  
  2434.       If a field which you intend to print is to be derived during
  2435.       the procedure and does not exist in a form as "countofinvoices"
  2436.       you can give it any name you wish up to forty characters but
  2437.       the name must not contain a ".". Once you have declared fields
  2438.       you can create the Output Format.
  2439.  
  2440.       If you declare an "Ad Hoc" field such as "countovinvoices" then
  2441.       you must include it in the format in order to define its type
  2442.       and length.
  2443.  
  2444.       If you require variables to store values during a procedure but
  2445.       you will not be out-putting their values then declare them as
  2446.       variables not fields.
  2447.  
  2448.       Ex.
  2449.  
  2450.       declare variables
  2451.          count as number
  2452.          lasttype as text
  2453.       end
  2454.  
  2455.       Unprinted variables can only have one of the two types "Number"
  2456.       or "Text".
  2457.  
  2458.       Field declarations must precede Variable declarations and both
  2459.       must precede executable code.
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.                                 - 37 -
  2471. ................................................................................
  2472.  
  2473.  
  2474.  
  2475.       DEFAULT                    FUNCTION                     DEFAULT
  2476.  
  2477.  
  2478.       This function returns the parameter if not overridden by user
  2479.       entry.
  2480.  
  2481.  
  2482.       Ex.    Default(5)
  2483.  
  2484.       Ex.    Default(system date)
  2485.  
  2486.       Ex.    Default(lookup(stock,price))
  2487.  
  2488.       The Default function is only used in form and input screen
  2489.       field derivations - It has no meaning in procedure code.
  2490.  
  2491.       Acceptable parameters
  2492.  
  2493.       Any value, expression, field, variable or nested function of
  2494.       the same type as the field in which it is used.
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.  
  2519.  
  2520.  
  2521.  
  2522.  
  2523.  
  2524.  
  2525.  
  2526.  
  2527.  
  2528.  
  2529.  
  2530.  
  2531.                                 - 38 -
  2532. ................................................................................
  2533.  
  2534.  
  2535.  
  2536.       DELAY                    FIELD CONTROL                    DELAY
  2537.  
  2538.  
  2539.       The "delay" control suspends processing for a given number of
  2540.       milliseconds.
  2541.  
  2542.       Ex.
  2543.  
  2544.       A procedure screen is used from a startup Batch execute menu as
  2545.       an opening screen to an application and has the following field
  2546.       derivations
  2547.  
  2548.       1.  "Welcome to this wonderful program" [delay 1000]
  2549.  
  2550.       2.  "Copyright Fred blogs"[delay 1000]
  2551.  
  2552.       3.  "Press F2 to start"
  2553.  
  2554.       If the field colours are "text" ,"alt1" or "alt2" then the
  2555.       three fields will "Popup" with a one second delay between each.
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.                                 - 39 -
  2593. ................................................................................
  2594.  
  2595.  
  2596.  
  2597.       DELAY                  PROCEDURE COMMAND                  DELAY
  2598.  
  2599.  
  2600.       The "Delay" command suspends processing for a given number of
  2601.       milliseconds (1 - 5000).
  2602.  
  2603.       Ex.
  2604.  
  2605.       declare variables
  2606.          x as number : total as number
  2607.       end
  2608.       for customers
  2609.          customers.balance = 0
  2610.          for invoices with acno = customers.acno
  2611.             display status "Totalling invoices for" + Customers.name
  2612.             delay 200
  2613.             customers.balance = customers.balance + invoices.total
  2614.          next
  2615.          update record
  2616.       next
  2617.  
  2618.       In the above example, wherever a customer only has one or two
  2619.       invoices to total, the status display would change very
  2620.       quickly.  By including a 200 millisecond delay you can ensure
  2621.       that each customers name is on screen at least long enough to
  2622.       be read.
  2623.  
  2624.       Delay values outside of 1 - 5000 are ignored.
  2625.       The delay parameter cannot be supplied as a variable.
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644.  
  2645.  
  2646.  
  2647.  
  2648.  
  2649.  
  2650.  
  2651.  
  2652.  
  2653.                                 - 40 -
  2654. ................................................................................
  2655.  
  2656.  
  2657.  
  2658.       DELETE CHOICE LISTS        UTILITY          DELETE CHOICE LISTS
  2659.  
  2660.  
  2661.       If you have Choice lists for choice fields that are no longer
  2662.       required you can delete them with this utility.
  2663.  
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.  
  2708.  
  2709.  
  2710.  
  2711.  
  2712.  
  2713.  
  2714.                                 - 41 -
  2715. ................................................................................
  2716.  
  2717.  
  2718.  
  2719.       DELETE RECORD          PROCEDURE COMMAND          DELETE RECORD
  2720.  
  2721.  
  2722.       The "Delete Record" command is used for the selective deletion
  2723.       of records in a form.
  2724.  
  2725.       Ex.
  2726.  
  2727.       for books with title = input.title
  2728.          delete record
  2729.       next
  2730.  
  2731.       This deletes the single book whose title is that entered on the
  2732.       input screen.
  2733.  
  2734.       for books with author = input.author
  2735.          delete record
  2736.       next
  2737.  
  2738.       This deletes the records of all books by the author entered on
  2739.       the input screen.
  2740.  
  2741.       When you use the "Delete Record" command it has the same effect
  2742.       as deleting a record in data entry. In other words the record
  2743.       is marked for deletion but will not actually be removed from
  2744.       the form until the next re-pack.
  2745.  
  2746.       If you use the "Delete Record" command to delete large numbers
  2747.       of records then you should pack the form afterward.
  2748.  
  2749.       If you wish to delete all records in a form use the "Clear
  2750.       records" command not the "Delete Record" command.
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  
  2756.  
  2757.  
  2758.  
  2759.  
  2760.  
  2761.  
  2762.  
  2763.  
  2764.  
  2765.  
  2766.  
  2767.  
  2768.  
  2769.  
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775.                                 - 42 -
  2776. ................................................................................
  2777.  
  2778.  
  2779.  
  2780.       DERIVE OFF             PROCEDURE COMMAND             DERIVE OFF
  2781.  
  2782.  
  2783.       Whenever an Easy Base procedure adds or updates a record then
  2784.       by default it checks the derivations of all fields during an
  2785.       add operation and any fields that are affected by an update
  2786.       operation. In other words, if you update the netprice field in
  2787.       a stock form and that form has derived fields for VAT and
  2788.       grossprice then those fields will also be updated.
  2789.  
  2790.       If the procedure adds or updates all fields then this process
  2791.       is superfluous and simply slows the procedure. You can disable
  2792.       form derivation checking with the "Derive Off" command.
  2793.  
  2794.       derive off
  2795.       for stock with item = input.item
  2796.          copy all from input
  2797.          update record
  2798.       next
  2799.  
  2800.       In the above example a stock form has several derived fields
  2801.       but the input screen also does the same derivations. There is
  2802.       therefore no need to re-check them when the record is updated.
  2803.  
  2804.       As a general rule, in procedures which add or update records
  2805.       from an input screen, you should derive all fields on the input
  2806.       screen rather than during the update process. The user will not
  2807.       notice the time taken to derive fields while he is filling them
  2808.       in but he will notice the time taken to derive them after he
  2809.       has pressed F2
  2810.  
  2811.       There is no corresponding "Derive On" command. Derivation
  2812.       checking is automatically turned back on at the end of the
  2813.       loop to which is prefixed by the "Derive Off" command. If you
  2814.       require derivation checking to be off for more than one loop in
  2815.       a procedure then you must issue the command before each loop.
  2816.  
  2817.  
  2818.       Note:-
  2819.  
  2820.       If the "Derive Off" command is not issued before a loop then
  2821.       form level derivations override procedure derivations. This is
  2822.       not normally a problem, but can be if you try to change the
  2823.       case of a field for printing.
  2824.  
  2825.       For customers
  2826.          customers.name = proper(customers.name)
  2827.          print list items
  2828.       next
  2829.  
  2830.       If the "Name" field on the "Customers" form is derived as
  2831.       Upper(name) then the procedure will print the customers names
  2832.       in upper case.  You can overcome the problem either by
  2833.       cancelling the field derivation or by transferring the
  2834.       customers name to a variable and converting that to proper.
  2835.  
  2836.                                 - 43 -
  2837. ................................................................................
  2838.  
  2839.  
  2840.  
  2841.       DISPLAY STATUS         PROCEDURE COMMAND         DISPLAY STATUS
  2842.  
  2843.  
  2844.       If you write a procedure which has no output then Easy Base
  2845.       will display a "Running" flash at the top right hand side of
  2846.       the screen. For procedures which only take a few seconds to run
  2847.       this is sufficient to let the operator know that something is
  2848.       happening. For procedures that take some time to complete you
  2849.       should include a status display showing the progress of the
  2850.       procedure. A status display not only allays the nagging
  2851.       suspicion that the system has hung up but also allows the
  2852.       operator to estimate how long it will take.
  2853.  
  2854.       To create a status display just issue the command "Display
  2855.       Status" followed by a message composed of text in quotation
  2856.       marks and fields or variables concatenated by the + sign.
  2857.  
  2858.       Ex.
  2859.  
  2860.  
  2861.       declare variables
  2862.          x as number : y as number
  2863.       end
  2864.       for employees with taxcode = input.oldtaxcode
  2865.          y = total copies :exit for    'get copies to y for display
  2866.       next
  2867.       for employees with taxcode = input.oldtaxcode
  2868.          x = x + 1
  2869.          display status "Updating Record" + x + "of" + y
  2870.          employees.taxcode = input.newtaxcode
  2871.          update record
  2872.       next
  2873.  
  2874.       The status line is displayed centrally in a small window when
  2875.       the procedure runs. A Status line can have a maximum of 68
  2876.       characters. If you create a status line of more than 68
  2877.       characters then it will be cut short to that length.
  2878.  
  2879.       If you need to display counters in two nested loops then write
  2880.       the full display line in the outer loop and "display status"
  2881.       with no parameters in the inner loop.
  2882.  
  2883.       for customers
  2884.          x = x + 1
  2885.          - loop statements -
  2886.          display status "Checking Invoice" + y + "of customer" + x
  2887.          for invoices with customer = customers.name
  2888.             y = y + 1
  2889.             - Loop Statements -
  2890.             display status
  2891.          next
  2892.       next
  2893.  
  2894.  
  2895.  
  2896.  
  2897.                                 - 44 -
  2898. ................................................................................
  2899.  
  2900.  
  2901.  
  2902.       DO..LOOP               PROCEDURE COMMAND               DO..LOOP
  2903.  
  2904.  
  2905.       The "Do" loop structure is used in the Easy Base Procedure code
  2906.       to repeat a series of commands or statements. Whenever a
  2907.       procedure reaches a "Do" command it repeats all the statements
  2908.       between the "Do" and the "Loop" statements until the loop is
  2909.       broken by an "Exit Do" command.
  2910.  
  2911.       Ex.
  2912.  
  2913.       The following code fragment prints 10 copies of the top fifty
  2914.       best selling items in a "stock" form.
  2915.  
  2916.  
  2917.       .........................code............................
  2918.       declare output fields
  2919.          stock.item : stock.sales : today
  2920.       end
  2921.       Declare variables
  2922.          copies as number : items as number
  2923.       end
  2924.       today = system date
  2925.       do
  2926.          copies = copies + 1 :items = 0
  2927.          if copies = 11 then exit do
  2928.          bold on
  2929.          print report header
  2930.          bold off
  2931.          for stock with sales in reverse order
  2932.             items = items + 1
  2933.             if items = 51 then exit for
  2934.             print list items
  2935.          next
  2936.          bold on : print report footer : bold off
  2937.          page feed
  2938.       loop
  2939.       ............................format.....................
  2940.       .Report Header
  2941.          ═════════════════════════════════════════════════════
  2942.          Top 50 Best Selling Items               {today field}
  2943.          ═════════════════════════════════════════════════════
  2944.       .list items
  2945.             {stock.item field}        {stock.sales field}
  2946.       .Report Footer
  2947.          ═════════════════════════════════════════════════════
  2948.       .end
  2949.  
  2950.  
  2951.  
  2952.  
  2953.  
  2954.  
  2955.  
  2956.  
  2957.  
  2958.                                 - 45 -
  2959. ................................................................................
  2960.  
  2961.  
  2962.  
  2963.       DUPLICATE PREVENTION        METHOD         DUPLICATE PREVENTION
  2964.  
  2965.  
  2966.       1.  Where "Blank" values are acceptable.
  2967.  
  2968.       Quite often you will come across a situation where a field must
  2969.       not have duplicate entries but can still be left blank. You
  2970.       cannot define this field as unique because that would prevent
  2971.       more than one blank entry.  A good example of such a situation
  2972.       is in the "Menus Form" of Easy Base. The definition and unique
  2973.       field is the "Menu Title" but no two records may have the same
  2974.       entry in the sign on "Password" field.
  2975.  
  2976.       To prevent duplicate entries other than blanks you must enter a
  2977.       relationship between the form and itself with the field to be
  2978.       tested as the related field in both primary and secondary
  2979.       forms.
  2980.  
  2981.       The field is then derived as :-
  2982.  
  2983.       If(lookup(menus,password) <> blank,blank[beepDuplicate Password
  2984.                !],password)
  2985.  
  2986.       2.   When entering records via procedures.
  2987.  
  2988.       When you use a procedure to enter a new record to a form it is
  2989.       not automatically checked as "Unique".   To ensure that
  2990.       duplicate entries are not entered via procedures you must check
  2991.       that the data entered on the procedures input screen is unique
  2992.       to the form you are about to enter it to before running the
  2993.       procedure.  For example: If you were about to enter a record to
  2994.       the "Manufacturers" form in which the "Name" field was unique
  2995.       then the "Name" field on the input screen would be derived:-
  2996.  
  2997.          if(lookup(manufacturers,name) <> blank,blank[beepDuplicate
  2998.                     Name !cursor name],name)
  2999.  
  3000.  
  3001.  
  3002.  
  3003.  
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.  
  3012.  
  3013.  
  3014.  
  3015.  
  3016.  
  3017.  
  3018.  
  3019.                                 - 46 -
  3020. ................................................................................
  3021.  
  3022.  
  3023.  
  3024.       Erase                    File Command                     Erase
  3025.  
  3026.  
  3027.       The "Erase" command erases files. It accepts wildcard
  3028.       parameters.
  3029.  
  3030.       ex.
  3031.  
  3032.       Erase "C:\letters\*.doc"
  3033.  
  3034.       Ex.
  3035.  
  3036.       index off
  3037.       For faxlog with date < system date - 30
  3038.          erase jointext("C:\Fax\",faxlog.filename)
  3039.          delete record
  3040.       next
  3041.  
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.  
  3049.  
  3050.  
  3051.  
  3052.  
  3053.  
  3054.  
  3055.  
  3056.  
  3057.  
  3058.  
  3059.  
  3060.  
  3061.  
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.  
  3080.                                 - 47 -
  3081. ................................................................................
  3082.  
  3083.  
  3084.  
  3085.       ESCAPE ON/OFF          PROCEDURE COMMAND          ESCAPE ON/OFF
  3086.  
  3087.  
  3088.       When a procedure is running in Easy Base, it cannot, by
  3089.       default, be interrupted. If your procedure simply lists data to
  3090.       the screen then the end user may not need to see the entire
  3091.       output. You can allow the user to terminate a procedure
  3092.       prematurely with the "Escape On" command.
  3093.  
  3094.       If a procedure performs several tasks, you can selectively
  3095.       enable and disable the Escape Key with the commands "Escape On"
  3096.       and "Escape" Off"
  3097.  
  3098.       Ex.
  3099.  
  3100.       For newpayscales
  3101.          print list items
  3102.       next
  3103.       escape off
  3104.       for newpayscales
  3105.          for employees with scale = newpayscales.scale
  3106.             employees.rate = newpayscales.rate
  3107.             update record
  3108.          next
  3109.       next
  3110.       escape on
  3111.       for employees
  3112.          print newpay
  3113.       next
  3114.  
  3115.       In the above example a procedure lists new pay scales, updates
  3116.       the "Employees" form with the new pay rate and then lists the
  3117.       employees with their new rates.
  3118.  
  3119.       While the procedure is running the operator can terminate it
  3120.       during either of the lists but he cannot terminate it during
  3121.       the process of updating the "Employees" form.
  3122.  
  3123.  
  3124.  
  3125.  
  3126.  
  3127.  
  3128.  
  3129.  
  3130.  
  3131.  
  3132.  
  3133.  
  3134.  
  3135.  
  3136.  
  3137.  
  3138.  
  3139.  
  3140.  
  3141.                                 - 48 -
  3142. ................................................................................
  3143.  
  3144.  
  3145.  
  3146.       EXIT BATCH MENU        PROCEDURE COMMAND        EXIT BATCH MENU
  3147.  
  3148.  
  3149.       The "Exit Batch Menu" command terminates a current Batch Menu
  3150.       and returns control to the menu which called it.
  3151.  
  3152.       Ex.
  3153.  
  3154.       An application starts with a batch menu which calls a second
  3155.       batch menu which performs regular daily tasks. It then calls
  3156.       the main user menu. If the application is exited after the
  3157.       daily tasks batch menu has been completed then you will not
  3158.       wish to re-run the daily tasks when the application is
  3159.       restarted on the same day. To prevent this create a form
  3160.       "tasksdone" with a single field "date" and enter a single
  3161.       record with yesterdays date.
  3162.  
  3163.       The first procedure on the daily tasks batch menu would then be
  3164.  
  3165.       for tasksdone
  3166.          if tasksdone.date = system date then
  3167.             exit batch menu
  3168.          else
  3169.             tasksdone.date = system date
  3170.             update record
  3171.          end if
  3172.       next
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.  
  3185.  
  3186.  
  3187.  
  3188.  
  3189.  
  3190.  
  3191.  
  3192.  
  3193.  
  3194.  
  3195.  
  3196.  
  3197.  
  3198.  
  3199.  
  3200.  
  3201.  
  3202.                                 - 49 -
  3203. ................................................................................
  3204.  
  3205.  
  3206.  
  3207.       EXIT PROCEDURE         PROCEDURE COMMAND         EXIT PROCEDURE
  3208.  
  3209.  
  3210.       The "Exit Procedure" command terminates a procedure.
  3211.  
  3212.       Ex.
  3213.  
  3214.       if input.codeword <> "fred" then exit procedure
  3215.       for staffconfidential with name = input.name
  3216.          print list items
  3217.       next
  3218.  
  3219.  
  3220.       If the procedure has a repeating input screen then this is
  3221.       cancelled by the "Exit Procedure" command.
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.  
  3230.  
  3231.  
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.  
  3238.  
  3239.  
  3240.  
  3241.  
  3242.  
  3243.  
  3244.  
  3245.  
  3246.  
  3247.  
  3248.  
  3249.  
  3250.  
  3251.  
  3252.  
  3253.  
  3254.  
  3255.  
  3256.  
  3257.  
  3258.  
  3259.  
  3260.  
  3261.  
  3262.  
  3263.                                 - 50 -
  3264. ................................................................................
  3265.  
  3266.  
  3267.  
  3268.       File_Date File_Time      System value       File_Date File_Time
  3269.  
  3270.  
  3271.       Whenever you open a non Easy Base file it's date and time stamp
  3272.       are available in the system values File_Date and File_Time.
  3273.  
  3274.  
  3275.  
  3276.  
  3277.  
  3278.  
  3279.  
  3280.  
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294.  
  3295.  
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.  
  3304.  
  3305.  
  3306.  
  3307.  
  3308.  
  3309.  
  3310.  
  3311.  
  3312.  
  3313.  
  3314.  
  3315.  
  3316.  
  3317.  
  3318.  
  3319.  
  3320.  
  3321.  
  3322.  
  3323.  
  3324.                                 - 51 -
  3325. ................................................................................
  3326.  
  3327.  
  3328.  
  3329.       File_Len                 System Value                  File_Len
  3330.  
  3331.  
  3332.       Whenever you open an external file with the "Open" Command the
  3333.       length of the opened file is available in the system value
  3334.       File_Len.
  3335.  
  3336.       The main use of the File_Len value is to position the
  3337.       Read/Write pointer ready to append data to an existing file.
  3338.  
  3339.       ...................
  3340.       declare variables
  3341.          CR as text
  3342.       end
  3343.       CR = jointext(chr$(13),chr$(10))
  3344.       Open "C:\WP\Address.txt"
  3345.       seek File_Len + 1
  3346.       Write Input.name
  3347.       Write CR
  3348.       Write Input.address1
  3349.       Write CR
  3350.       Write Input.address2
  3351.       Write CR
  3352.       Write input.address3
  3353.       Write CR
  3354.       Close
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360.  
  3361.  
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.  
  3370.  
  3371.  
  3372.  
  3373.  
  3374.  
  3375.  
  3376.  
  3377.  
  3378.  
  3379.  
  3380.  
  3381.  
  3382.  
  3383.  
  3384.  
  3385.                                 - 52 -
  3386. ................................................................................
  3387.  
  3388.  
  3389.  
  3390.       File_Pos                 System Value                  File_Pos
  3391.  
  3392.  
  3393.       Whenever you open an external file with the "Open" command,
  3394.       The position of the file read/write pointer is available in the
  3395.       system value File_Pos.
  3396.  
  3397.       The value is in bytes counting the first byte as 1.
  3398.  
  3399.       The File_Pos value is used to make relative movements of the
  3400.       Read/write pointer  with the "Seek" command
  3401.  
  3402.       .....................................
  3403.       Open "C:\myfiles\Report.txt"
  3404.       for reports new record
  3405.          Read 10 to reports.CustNo
  3406.          Seek File_pos + 3
  3407.          read 20 to reports.Custname
  3408.       next
  3409.       close
  3410.       ......................................
  3411.  
  3412.       You can move the Read/Write pointer in either direction.
  3413.  
  3414.       Seek File_Pos - 20
  3415.  
  3416.       If you move the pointer back beyond the start of the file Easy
  3417.       Base generates the error message "Seek Value < 1 !".
  3418.  
  3419.  
  3420.       See Also: Open, Close, Seek, Read, Write
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.  
  3428.  
  3429.  
  3430.  
  3431.  
  3432.  
  3433.  
  3434.  
  3435.  
  3436.  
  3437.  
  3438.  
  3439.  
  3440.  
  3441.  
  3442.  
  3443.  
  3444.  
  3445.  
  3446.                                 - 53 -
  3447. ................................................................................
  3448.  
  3449.  
  3450.  
  3451.       Find                     File Command                      Find
  3452.  
  3453.  
  3454.       The "Find" command is used to select non Easy Base files using
  3455.       a wildcard Spec. When you issue the command Find with a
  3456.       wildspec parameter, Easy Base finds the first file to match the
  3457.       spec and puts its name in the Found_File system value. If you
  3458.       then repeat the command without a spec, Easy Base finds the
  3459.       next matching filename and puts it in Found_File. When all
  3460.       files have been found the Found_File value reverts to "Blank".
  3461.  
  3462.       Example: A company recieves replacement part orders by FAX.
  3463.       After the Address lines the FAX is formatted in four lines
  3464.  
  3465.       "Order Start:" - Engineers ID - Part ID - Quantity.
  3466.  
  3467.       All incoming FAXes for parts are filed in C:\FAX\ORDERS.
  3468.  
  3469.       The following procedure imports the orders to the Orders form
  3470.       and then deletes the FAX files.
  3471.  
  3472.       Declare variables
  3473.          Ln as text
  3474.       end
  3475.       Find "C:\FAX\ORDERS\*.*"
  3476.       Do
  3477.          If Found_File = Blank then exit do
  3478.          For orders new record
  3479.             open jointext("C:\FAX\ORDERS\",Found_File)
  3480.             Do
  3481.                Read line to Ln
  3482.                If Ln = "Order start:" then exit do
  3483.             Loop
  3484.             Read line to orders.engineer
  3485.             Read line to order.part
  3486.             read line to orders.quantity
  3487.          next
  3488.          Close
  3489.          Find
  3490.       Loop
  3491.       Erase "C:\FAX\ORDERS\*.*"
  3492.  
  3493.  
  3494.  
  3495.  
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.  
  3502.  
  3503.  
  3504.  
  3505.  
  3506.  
  3507.                                 - 54 -
  3508. ................................................................................
  3509.  
  3510.  
  3511.  
  3512.       FIXED POINT               FIELD TYPE                FIXED POINT
  3513.  
  3514.  
  3515.       Fixed point fields can display up to 14 digits. They use the
  3516.       comma for thousands separation and the full stop for decimal
  3517.       separation.
  3518.  
  3519.       There are no rounding errors with fixed point fields.
  3520.  
  3521.       See - Operators arithmetic
  3522.  
  3523.  
  3524.  
  3525.  
  3526.  
  3527.  
  3528.  
  3529.  
  3530.  
  3531.  
  3532.  
  3533.  
  3534.  
  3535.  
  3536.  
  3537.  
  3538.  
  3539.  
  3540.  
  3541.  
  3542.  
  3543.  
  3544.  
  3545.  
  3546.  
  3547.  
  3548.  
  3549.  
  3550.  
  3551.  
  3552.  
  3553.  
  3554.  
  3555.  
  3556.  
  3557.  
  3558.  
  3559.  
  3560.  
  3561.  
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.  
  3568.                                 - 55 -
  3569. ................................................................................
  3570.  
  3571.  
  3572.  
  3573.       FLOATING POINT            FIELD TYPE             FLOATING POINT
  3574.  
  3575.  
  3576.       Floating point fields can display up to 14 digits. They do not
  3577.       have a thousands separator. They are left justified.
  3578.  
  3579.  
  3580.  
  3581.  
  3582.  
  3583.  
  3584.  
  3585.  
  3586.  
  3587.  
  3588.  
  3589.  
  3590.  
  3591.  
  3592.  
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598.  
  3599.  
  3600.  
  3601.  
  3602.  
  3603.  
  3604.  
  3605.  
  3606.  
  3607.  
  3608.  
  3609.  
  3610.  
  3611.  
  3612.  
  3613.  
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.  
  3624.  
  3625.  
  3626.  
  3627.  
  3628.  
  3629.                                 - 56 -
  3630. ................................................................................
  3631.  
  3632.  
  3633.  
  3634.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3635.  
  3636.  
  3637.       The "For" command initiates loops which load records from forms
  3638.       for processing. All statements between the "For" and the "Next"
  3639.       commands are repeated for each record selected.
  3640.  
  3641.       Ex.
  3642.  
  3643.       For Videos
  3644.          If Videos.price = 2.00 then Videos.price = 2.50
  3645.          update record
  3646.       next
  3647.  
  3648.       In the above example each record in the "Videos" form is loaded
  3649.       into memory - the price field is checked and if it is 2.00 then
  3650.       it is altered to 2.50 - the record is then updated on disk.
  3651.  
  3652.       "For" loops can be nested to any depth.
  3653.  
  3654.       Ex.
  3655.  
  3656.       for videoprices
  3657.          for videos
  3658.             if videos.price = videoprices.price then
  3659.                print list items
  3660.             end if
  3661.          next
  3662.       next
  3663.  
  3664.       In the above example the outer loop loads each record from the
  3665.       "Videoprices" form.  While each of these is in memory it then
  3666.       loads each record from the "Videos" form, tests to see if the
  3667.       price field in "Videos" is the same as the price field in
  3668.       "Videoprices" and if so prints the list items section of the
  3669.       report format (containing the video title field) thus grouping
  3670.       all video titles by price.
  3671.  
  3672.       If a "For" loop is unqualified as above then every record is
  3673.       processed starting at one and advancing in sequence. "For"
  3674.       loops can be qualified in several ways in order to select
  3675.       records in other orders or groups. The following qualifications
  3676.       are available:-
  3677.  
  3678.       For (form) with (fieldname) in order
  3679.       For (form) with (fieldname) in reverse order
  3680.       For (form) with (fieldname) =  (value)
  3681.       For (form) with (fieldname) >  (value)
  3682.       For (form) with (fieldname) <  (value)
  3683.       For (form) with (fieldname) >= (value)
  3684.       For (form) with (fieldname) <= (value)
  3685.       For (form) new record
  3686.  
  3687.       With the exception of the "New Record" qualification, all
  3688.       accept the suffix "Unique" and an "Alias" for the form name.
  3689.  
  3690.                                 - 57 -
  3691. ................................................................................
  3692.  
  3693.  
  3694.  
  3695.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3696.  
  3697.  
  3698.       If a "For" loop is qualified by "in order" or "in reverse
  3699.       order" then the records are selected in alphabetical or reverse
  3700.       alphabetical order if the selection field is text, and in
  3701.       numeric or reverse numeric order if the selection field is
  3702.       numeric.
  3703.  
  3704.       Ex.
  3705.  
  3706.       for books with title in order
  3707.          print list items
  3708.       next
  3709.  
  3710.       Ex.
  3711.  
  3712.       for salesmen with monthlysales in reverse order
  3713.          print list items
  3714.       next
  3715.  
  3716.       If a "For" loop is qualified by "in order unique" or "in
  3717.       reverse order unique" then records will be selected in order or
  3718.       in reverse order as above. However, where there are multiple
  3719.       occurrence of the same field value a "unique" loop will only
  3720.       select the first occurrence of each value if the loop is in
  3721.       order or the last occurrence if the loop is in reverse order.
  3722.  
  3723.       Ex.
  3724.  
  3725.       for books with category in order unique
  3726.          count = count + 1
  3727.          print list items
  3728.       next
  3729.       print categorycount
  3730.  
  3731.       This example prints and counts the different categories in the
  3732.       "books" form.
  3733.  
  3734.       Ex.
  3735.  
  3736.       for theatreseats with price in reverse order unique
  3737.          for seatprices new record
  3738.             seatprices.price = theatreseats.price
  3739.          next
  3740.       next
  3741.  
  3742.       The above example selects one example only of each seat price
  3743.       in an existing "theatreseats" form in descending price order
  3744.       and enters a new record in the new "seatprices" form.
  3745.  
  3746.  
  3747.  
  3748.  
  3749.  
  3750.  
  3751.                                 - 58 -
  3752. ................................................................................
  3753.  
  3754.  
  3755.  
  3756.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3757.  
  3758.  
  3759.       If a "For" loop is qualified by a "Fieldname = " condition then
  3760.       only the record or records where the field contents match the
  3761.       condition will be selected.
  3762.  
  3763.       Ex.
  3764.  
  3765.       for books with category = "fiction"
  3766.          print list items
  3767.       next
  3768.  
  3769.       This example prints all books which have the category "fiction"
  3770.  
  3771.       Ex.
  3772.  
  3773.       For customers with acno = input.acno
  3774.          creditlimit = input.creditlimit
  3775.          update record
  3776.       next
  3777.  
  3778.       In this example the procedure has an input screen where the
  3779.       operator enters a customers account number and new credit
  3780.       limit. On pressing F2 the procedure finds the single record in
  3781.       the "Customers" form which has the input account number and
  3782.       updates the "creditlimit" field.
  3783.  
  3784.  
  3785.  
  3786.  
  3787.  
  3788.  
  3789.  
  3790.  
  3791.  
  3792.  
  3793.  
  3794.  
  3795.  
  3796.  
  3797.  
  3798.  
  3799.  
  3800.  
  3801.  
  3802.  
  3803.  
  3804.  
  3805.  
  3806.  
  3807.  
  3808.  
  3809.  
  3810.  
  3811.  
  3812.                                 - 59 -
  3813. ................................................................................
  3814.  
  3815.  
  3816.  
  3817.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3818.  
  3819.  
  3820.       If a "For" loop is qualified by a "with (fieldname) > " or
  3821.       "with (fieldname) >= " condition then records are selected in
  3822.       order like the "with (fieldname) in order" qualification but
  3823.       starting with the first record where the field contents match
  3824.       the condition value rather than the first record.
  3825.  
  3826.       Similarly the qualifications "with (fieldname) < " and "with
  3827.       (fieldname) <= " select records in reverse order but starting
  3828.       with the last record to match the condition value.
  3829.  
  3830.       In case you are new to progamming it should be pointed out that
  3831.       the relational operators >, <, >= and <= can be applied to text
  3832.       as well as to numbers. When they are applied to text they
  3833.       relate to the text's alphabetical order.
  3834.  
  3835.       These four qualifications provide the means to select any
  3836.       subset of records which has a range of values in a particular
  3837.       field.
  3838.  
  3839.       Ex.
  3840.  
  3841.       for pupils with age > 6
  3842.          if pupils.age = 12 then exit for
  3843.          print list items
  3844.       next
  3845.  
  3846.       This example prints the names of all pupils between the ages of
  3847.       seven and eleven. The "For" qualification starts selection in
  3848.       numeric order of age starting at seven and the "Exit for"
  3849.       command terminates the loop when the first pupil aged twelve is
  3850.       loaded.
  3851.  
  3852.       Ex.
  3853.  
  3854.       A "Videos" form has a compound index field called "catorder"
  3855.       which is derived by joining the text of the "category" and
  3856.       "title" fields. The following procedure selects all the videos
  3857.       which have the category entered on the input screen and lists
  3858.       them with the title in alphabetic order.
  3859.  
  3860.       for videos with catorder >= input.category
  3861.          if videos.category > input.category then exit for
  3862.          print list items
  3863.       next
  3864.  
  3865.       Ex.
  3866.  
  3867.       for vehicles with seats > 4 unique
  3868.          count = count + 1
  3869.       next
  3870.  
  3871.       "count" returns the number of different seat capacities > 4
  3872.  
  3873.                                 - 60 -
  3874. ................................................................................
  3875.  
  3876.  
  3877.  
  3878.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3879.  
  3880.  
  3881.       If a "For" loop is qualified by "new record" then no records
  3882.       are selected from the form. Instead, a new blank record is
  3883.       created at the "For" command, all statements between the "For"
  3884.       and "Next" commands apply to this new record and it is entered
  3885.       to the form at the "Next" command.
  3886.  
  3887.       Ex.
  3888.  
  3889.       for books new record
  3890.          books.dateinstock = system date
  3891.          copy all from input
  3892.       next
  3893.  
  3894.       This example enters a new record to the "Books" form making the
  3895.       "dateinstock" field equal the system date and copying all other
  3896.       fields from the procedures input screen.
  3897.  
  3898.       Ex.
  3899.  
  3900.       declare variables
  3901.         hourcount as number
  3902.       end
  3903.       '..............clear last wages
  3904.       clear records from wagelist
  3905.       '..........count employees hours from timesheet...
  3906.       for employees
  3907.          hourcount = 0
  3908.          for timesheet with worksno = employees.worksno
  3909.             hourcount = hourcount + timesheet.hours
  3910.          next
  3911.          for wagelist new record
  3912.             wagelist.worksno = employees.worksno
  3913.             wagelist.name = employees.name
  3914.             wagelist.hours = hourcount
  3915.             wagelist.grosswage = employees.wagerate * hourcount
  3916.          next
  3917.       next
  3918.       '.................print the wages list
  3919.       for wagelist with worksno in order
  3920.          print list items
  3921.       next
  3922.  
  3923.       This procedure starts by erasing the present contents of the
  3924.       "wagelist" form. It then selects each record from the
  3925.       "employees" form, counts all entries in the "timesheet" form
  3926.       for the employee and enters a new record in the "wagelist"
  3927.       form. Finally it prints the new wage list.
  3928.  
  3929.  
  3930.  
  3931.  
  3932.  
  3933.  
  3934.                                 - 61 -
  3935. ................................................................................
  3936.  
  3937.  
  3938.  
  3939.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3940.  
  3941.  
  3942.       Occasionally you may need to nest a "For" loop of a form within
  3943.       another "For" loop of the same form. If you do this, then in
  3944.       order to differentiate between the fields in the outer and
  3945.       inner loops you must allocate an "alias" name to the form in
  3946.       one of the loops. When you allocate an alias to a form name
  3947.       then all the fields of the form can also be referenced by the
  3948.       alias name.
  3949.  
  3950.       Ex.
  3951.       .......................procedure code...........
  3952.       declare output fields
  3953.          males : females : pupils.age
  3954.       end
  3955.       for pupils with age in order unique
  3956.          males = 0 : females = 0
  3957.          for pupils alias agegroups with age = pupils.age
  3958.             if agegroups.sex = "male" then
  3959.                males = males + 1
  3960.             else
  3961.                females = females + 1
  3962.             end if
  3963.          next
  3964.          print list items
  3965.       next
  3966.       ....................output format......................
  3967.       .list items
  3968.       There are {males} males and {females} females aged {pupils.age}
  3969.       .end
  3970.  
  3971.  
  3972.       This example counts and prints the number of male and female
  3973.       pupils in each age group.
  3974.  
  3975.       If you intend to print fields from one of the nested loops as
  3976.       the "Age" field above then you should give the alias name to
  3977.       the other loop. You can only declare an output field with the
  3978.       real form name. If you have to print fields from both loops
  3979.       then you must declare an "Ad Hoc" field and pass the alias
  3980.       fields contents to it for printing.
  3981.  
  3982.       If you need to exclude individual or groups of records from
  3983.       selection just use the "Skip Record" or "Skip Group" command.
  3984.  
  3985.       Ex.
  3986.  
  3987.       for videos with category in order
  3988.          if videos.category = "Cartoon" then skip group
  3989.          print list items
  3990.       next
  3991.  
  3992.  
  3993.  
  3994.  
  3995.                                 - 62 -
  3996. ................................................................................
  3997.  
  3998.  
  3999.  
  4000.       FORM LETTERS                METHOD                 FORM LETTERS
  4001.  
  4002.  
  4003.       To print form letters (circulars) with a different address and
  4004.       salutation for each entry in an address form simply type the
  4005.       entire letter between the .List Items and .End of the output
  4006.       format.
  4007.  
  4008.       .........................procedure code........
  4009.       Declare output fields
  4010.          Addr.name : Addr.street : Addr.town
  4011.          Addr.salutation
  4012.          date
  4013.       end
  4014.       date = datetext(system date)
  4015.       for addr
  4016.          print list items
  4017.          page feed
  4018.       next
  4019.  
  4020.       .........................output format........
  4021.       .List Items
  4022.                                              My street
  4023.                                              My county
  4024.                                              {date field  }
  4025.  
  4026.  
  4027.       {Addr.name field    }
  4028.       {Addr.street field  }
  4029.       {Addr.town field    }
  4030.  
  4031.  
  4032.       Dear {Addr.salutation},
  4033.  
  4034.           You are invited................................
  4035.       ...................................................
  4036.       ...................................................
  4037.       ..........................................
  4038.  
  4039.       Yours faithfully,
  4040.  
  4041.  
  4042.  
  4043.       Fred A Blogs
  4044.       .End
  4045.  
  4046.       Although this is the fastest way to produce a short form
  4047.       letter, the Format Editor is not the nicest place to write
  4048.       text. If you want the benefits of word wrap and spell checking
  4049.       then you can create a form in which to write the letter. Create
  4050.       text block fields to hold a page of text and a name field so
  4051.       that you can store many different letters and print them with
  4052.       the same procedure. If your letters are to be more than one
  4053.       page long then put the same name on each page.
  4054.  
  4055.  
  4056.                                 - 63 -
  4057. ................................................................................
  4058.  
  4059.  
  4060.  
  4061.       FORM LETTERS                METHOD                 FORM LETTERS
  4062.  
  4063.  
  4064.       To print the form letters from the "Letters" form your
  4065.       procedure must now have an input screen which looks up the name
  4066.       of the letter to be printed.
  4067.  
  4068.       '............................CODE.....................
  4069.       declare output fields
  4070.          addr.name : addr.street : addr.town :addr.salutation
  4071.          date :letters.block1 :letters.block2 :letters.block3
  4072.       end
  4073.       declare variables
  4074.          page as number
  4075.       end
  4076.       date = datetext(system date)
  4077.       for addr
  4078.          page = 0
  4079.          for letters with name = input.name
  4080.             page = page + 1
  4081.             if page = 1 then print list items
  4082.             if page > 1 then print extra
  4083.             page feed
  4084.          next
  4085.       next
  4086.  
  4087.       The output format is similar to that shown on the previous page
  4088.       but the text in the .list items section is replaced by the text
  4089.       block fields Letters.block1 ,letters.block2 and letters.block3
  4090.       and an additional section .extra is added which has the same
  4091.       text block fields but no address or salutation.
  4092.  
  4093.  
  4094.  
  4095.  
  4096.  
  4097.  
  4098.  
  4099.  
  4100.  
  4101.  
  4102.  
  4103.  
  4104.  
  4105.  
  4106.  
  4107.  
  4108.  
  4109.  
  4110.  
  4111.  
  4112.  
  4113.  
  4114.  
  4115.  
  4116.  
  4117.                                 - 64 -
  4118. ................................................................................
  4119.  
  4120.  
  4121.  
  4122.       FORMATTED TEXT            FIELD TYPE             FORMATTED TEXT
  4123.  
  4124.  
  4125.       If you define a field with the type "formatted text" a window
  4126.       opens up in which you enter the formatting characters. The
  4127.       characters which are to be entered by the user are shown as
  4128.       question marks. Any other characters which you enter become
  4129.       permanent fixtures in the field. The "formatted text" field can
  4130.       be up to twenty characters long and can be used for dates,
  4131.       national insurance numbers etc.
  4132.  
  4133.       Formatted text fields should not be derived.
  4134.  
  4135.  
  4136.  
  4137.  
  4138.  
  4139.  
  4140.  
  4141.  
  4142.  
  4143.  
  4144.  
  4145.  
  4146.  
  4147.  
  4148.  
  4149.  
  4150.  
  4151.  
  4152.  
  4153.  
  4154.  
  4155.  
  4156.  
  4157.  
  4158.  
  4159.  
  4160.  
  4161.  
  4162.  
  4163.  
  4164.  
  4165.  
  4166.  
  4167.  
  4168.  
  4169.  
  4170.  
  4171.  
  4172.  
  4173.  
  4174.  
  4175.  
  4176.  
  4177.  
  4178.                                 - 65 -
  4179. ................................................................................
  4180.  
  4181.  
  4182.  
  4183.       GLOBAL DEFAULTS             METHOD              GLOBAL DEFAULTS
  4184.  
  4185.  
  4186.       In many instances, an application will use the same default
  4187.       values in many procedures and field derivations. If you
  4188.       "hardwire" these as constants into your procedures and code
  4189.       then they will all have to be changed when the default value
  4190.       changes.
  4191.  
  4192.       Easy Base is supplied with a single global defaults form for
  4193.       VAT rates but you can create your own for any particular
  4194.       application.
  4195.  
  4196.       For instance, should you write a payroll system you would wish
  4197.       to be able to update the tax rates and bands globally
  4198.       throughout your application when they change.
  4199.  
  4200.       To do this, create a form to hold all the global defaults. In
  4201.       addition to the default fields add a single character text
  4202.       field derived "X" and index it. You then enter a single record
  4203.       with all the default values. The "X" field is there to create
  4204.       an artificial relationship between any input screen and the
  4205.       defaults form in order to lookup defaults.
  4206.  
  4207.       Wherever you need one or more global defaults in an input
  4208.       screen you simply add an invisible "x" field and enter a
  4209.       relationship between the procedure and the defaults form
  4210.       linking the "x" fields.
  4211.  
  4212.       The field "Tax" can now be derived:-
  4213.  
  4214.          taxablepay * lookup(defaults,taxrate)
  4215.  
  4216.       Similarly, you can pre load variables in procedure code for the
  4217.       default values:-
  4218.  
  4219.       Declare variables
  4220.         Taxrate1 as number:Taxrate2 as number
  4221.         Taxband1 as number:Taxband2 as number
  4222.       end
  4223.       for defaults
  4224.         Taxrate1 = defaults.taxrate1 :Taxrate2 = defaults.taxrate2
  4225.         Taxband1 = defaults.taxband1 :Taxband2 = defaults.taxband2
  4226.       next
  4227.  
  4228.       When the taxrates change you only have to alter them once in
  4229.       the Defaults form.
  4230.  
  4231.  
  4232.  
  4233.  
  4234.  
  4235.  
  4236.  
  4237.  
  4238.  
  4239.                                 - 66 -
  4240. ................................................................................
  4241.  
  4242.  
  4243.  
  4244.       GLOBAL NUMBER            SYSTEM VALUE             GLOBAL NUMBER
  4245.  
  4246.  
  4247.       The variables you create in Easy Base procedures are local
  4248.       variables - they cease to exist when the procedure ends. So
  4249.       that you can pass messages between procedures Easy base
  4250.       provides a single global variable "Global Number".  Once you
  4251.       allocate a value to "Global Number" that value remains
  4252.       unchanged (even if your computer has been turned off) until you
  4253.       allocate another value to it. You can of course pass many
  4254.       messages between procedures simply by entering records in forms
  4255.       and re-reading them but using "Global Number" is much quicker.
  4256.  
  4257.       The following example uses "Global Number" to make access to a
  4258.       user menu restricted by password.
  4259.  
  4260.       Two procedures are defined. The first, "getpassword" has a
  4261.       password field on its input screen and the following code:-
  4262.  
  4263.       if input.password = "gingerbread" then
  4264.          global number = 1
  4265.       else
  4266.          global number = 0
  4267.       end if
  4268.  
  4269.       The second procedure "checkpassword" has the following code:-
  4270.  
  4271.       if global number <> 1 then exit batch menu
  4272.       global number = 0
  4273.  
  4274.       The open access menu system has an item for the restricted menu
  4275.       but instead of calling it direct it calls the menu "Password"
  4276.       which is a batch execute menu with the items
  4277.  
  4278.       run procedure ----  getpassword
  4279.       run procedure ----  checkpassword
  4280.       user menu     ----  restricted
  4281.  
  4282.       If the password "gingerbread" has not been entered in the
  4283.       "getpassword" input screen then "checkpassword" will return
  4284.       control to the original menu.
  4285.  
  4286.  
  4287.  
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.  
  4294.  
  4295.  
  4296.  
  4297.  
  4298.  
  4299.  
  4300.                                 - 67 -
  4301. ................................................................................
  4302.  
  4303.  
  4304.  
  4305.       GOTO (FIELD) NEXT      DERIVATION PREFIX      GOTO (FIELD) NEXT
  4306.  
  4307.  
  4308.       In an Easy Base form or procedure input screen the cursor moves
  4309.       from field to field in the default order top left to bottom
  4310.       right when you press the Return key. You can alter this default
  4311.       order by deriving any field with "Goto (fieldname) next". If
  4312.       the field from which you wish to redirect the cursor already
  4313.       has a derivation formula you simply add the "Goto - Next" as a
  4314.       prefix.
  4315.  
  4316.       Ex.
  4317.  
  4318.       goto price next
  4319.  
  4320.       goto item next default(lookup(stock,name))
  4321.  
  4322.       Cursor redirection with the "Goto - next" derivation only
  4323.       occurs when the Return key is pressed it is not activated if
  4324.       you move the cursor with the directional arrow keys.
  4325.  
  4326.  
  4327.       Note: You can only have one prefix on any one field derivation.
  4328.  
  4329.  
  4330.  
  4331.  
  4332.  
  4333.  
  4334.  
  4335.  
  4336.  
  4337.  
  4338.  
  4339.  
  4340.  
  4341.  
  4342.  
  4343.  
  4344.  
  4345.  
  4346.  
  4347.  
  4348.  
  4349.  
  4350.  
  4351.  
  4352.  
  4353.  
  4354.  
  4355.  
  4356.  
  4357.  
  4358.  
  4359.  
  4360.  
  4361.                                 - 68 -
  4362. ................................................................................
  4363.  
  4364.  
  4365.  
  4366.       HOURS                      FUNCTION                       HOURS
  4367.  
  4368.  
  4369.       This function returns the hour ( 1 to 23) of the time parameter
  4370.  
  4371.       Ex.  Hour(system time)
  4372.  
  4373.       Ex.
  4374.  
  4375.       Labourcharge = (hours(endtime)-hours(starttime))* rate
  4376.  
  4377.  
  4378.       Acceptable parameters:
  4379.  
  4380.       System time
  4381.       Time field
  4382.       Maketime function
  4383.       Time expression
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399.  
  4400.  
  4401.  
  4402.  
  4403.  
  4404.  
  4405.  
  4406.  
  4407.  
  4408.  
  4409.  
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.  
  4420.  
  4421.  
  4422.                                 - 69 -
  4423. ................................................................................
  4424.  
  4425.  
  4426.  
  4427.       IF                         FUNCTION                          IF
  4428.  
  4429.  
  4430.       Ex.  if(num >= 0,"Positive","negative")
  4431.  
  4432.       The first parameter of the "if" function is an expression, the
  4433.       second is the value to be returned if the expression is true
  4434.       and the third is the value to be returned if the expression is
  4435.       false.
  4436.  
  4437.       If the third parameter is omitted and the expression is false
  4438.       then the field or variable retains any value it had before the
  4439.       function was called.
  4440.  
  4441.       The "if" function can be extended to a full "case" function
  4442.       simply by adding more expressions and return values.
  4443.  
  4444.       Ex.  if(num > 0,"Positive",num = 0,"Zero","Negative")
  4445.  
  4446.       There is no limit to the number of expressions and return
  4447.       values. If more than one expression is true the value returned
  4448.       is that for the first true expression. If none are true then
  4449.       the trailing value is returned as the "case else".
  4450.  
  4451.       Acceptable Parameters:
  4452.  
  4453.       Numeric expressions
  4454.       Quoted text
  4455.       Fields and variables
  4456.       Other nested functions
  4457.       System Values
  4458.  
  4459.  
  4460.  
  4461.  
  4462.  
  4463.  
  4464.  
  4465.  
  4466.  
  4467.  
  4468.  
  4469.  
  4470.  
  4471.  
  4472.  
  4473.  
  4474.  
  4475.  
  4476.  
  4477.  
  4478.  
  4479.  
  4480.  
  4481.  
  4482.  
  4483.                                 - 70 -
  4484. ................................................................................
  4485.  
  4486.  
  4487.  
  4488.       IF THEN ELSE           PROCEDURE COMMAND           IF THEN ELSE
  4489.  
  4490.  
  4491.       Easy Base recognizes the following "If Then Else"
  4492.       constructions.
  4493.  
  4494.       1.    if (condition) then (action)
  4495.             ------------------------------------------
  4496.       2.    if (condition) then (action) else (action)
  4497.             ------------------------------------------
  4498.       3.    if (condition) then
  4499.                (action)
  4500.                (action)
  4501.                (action)
  4502.             end if
  4503.             -----------------------------------------
  4504.       4.    if (condition) then
  4505.                (action)
  4506.                (action)
  4507.             else
  4508.                (action)
  4509.                (action)
  4510.             end if
  4511.  
  4512.       If then constructions can be nested to any depth.
  4513.  
  4514.       if (condition) and (condition) then
  4515.          (action)
  4516.          if (condition) or (condition) then
  4517.             (action)
  4518.             (action)
  4519.          else
  4520.             (action)
  4521.             if (condition) eqv (condition) then (action)
  4522.             (action)
  4523.          end if
  4524.          if (condition) then (action)
  4525.       else
  4526.          (action)
  4527.       end if
  4528.  
  4529.       Easy base does not interpret "Else if" constructions.
  4530.  
  4531.       Easy base does not interpret two "if" conditions on one line.
  4532.  
  4533.  
  4534.       In the above examples "action" applies to any Easy base command
  4535.       or full "Do Loop" or full "For Next" structure.
  4536.  
  4537.       You cannot split a "Do Loop" structure and you can only split a
  4538.       "For Next" structure by a simple "If then" and "End if" with no
  4539.       "else" command.
  4540.  
  4541.       Ex. on next page.
  4542.  
  4543.  
  4544.                                 - 71 -
  4545. ................................................................................
  4546.  
  4547.  
  4548.  
  4549.       IF THEN ELSE           PROCEDURE COMMAND           IF THEN ELSE
  4550.  
  4551.  
  4552.       In the following example the procedure has an input screen with
  4553.       a field "type". "type" is a choice field with the choices "In
  4554.       age order", "In alphabetic order" and "By sex". The procedure
  4555.       code selects one of three listings from the "Pupils" form by
  4556.       splitting "For Next" structures by "If Then" structures.
  4557.  
  4558.       if input.type = "in age order" then
  4559.          for pupils with age in order
  4560.       end if
  4561.       if input.type = "in alphabetic order" then
  4562.          for pupils with name in order
  4563.       end if
  4564.       if input.type = "by sex" then
  4565.          for pupils with sex in order
  4566.       end if
  4567.          print list items
  4568.       next
  4569.       next
  4570.       next
  4571.  
  4572.       The structure above is the only one in which "For Next"
  4573.       structures can be split. There must be a separate "If Then"
  4574.       followed by "End If" for each "For". There must be a "Next for
  4575.       each "For"  and there cannot be an "Else" anywhere in the
  4576.       construction.
  4577.  
  4578.  
  4579.  
  4580.  
  4581.  
  4582.  
  4583.  
  4584.  
  4585.  
  4586.  
  4587.  
  4588.  
  4589.  
  4590.  
  4591.  
  4592.  
  4593.  
  4594.  
  4595.  
  4596.  
  4597.  
  4598.  
  4599.  
  4600.  
  4601.  
  4602.  
  4603.  
  4604.  
  4605.                                 - 72 -
  4606. ................................................................................
  4607.  
  4608.  
  4609.  
  4610.       INDEX OFF              PROCEDURE COMMAND              INDEX OFF
  4611.  
  4612.  
  4613.       When an Easy Base procedure adds, updates or deletes a record
  4614.       then by default it updates any affected index files. As the
  4615.       majority of transaction procedures act on a single record this
  4616.       is the fastest method of processing. It does of course require
  4617.       that the form is periodically re-packed.  If, however, a
  4618.       procedure is to add, update or delete many records then
  4619.       updating each affected index file on each iteration of the
  4620.       "For" loop can be much slower than ignoring the indices during
  4621.       the loop and re-writing them from scratch afterward.
  4622.  
  4623.       You can take the "re-write" option by issuing the command
  4624.       "Index off" before the "For" loop.
  4625.  
  4626.       index off
  4627.       for employees
  4628.         for wagelist new record
  4629.            wagelist.worksno = employees.worksno
  4630.            wagelist.taxcode = employees.taxcode
  4631.         next
  4632.       next
  4633.  
  4634.       Obviously re-writing an entire index file when only one or two
  4635.       records are affected would be slower than simply updating the
  4636.       indices. The actual point at which "Index Off" becomes faster
  4637.       can only be determined by trial but as a general rule the two
  4638.       systems take equal time when between 12 and 15 percent of the
  4639.       records of a file are affected and the advantage of "Index Off"
  4640.       becomes greater the bigger this percentage.
  4641.  
  4642.       There is no corresponding "Index On" command. Indexing is
  4643.       turned back on automatically and the index files are re-written
  4644.       at the end of the loop to which the command applies. If you
  4645.       require indexing off during more than one loop you must issue
  4646.       the command before each.
  4647.  
  4648.       index off
  4649.       for invoices with date < makedate(05,04,93)
  4650.          delete records
  4651.       next
  4652.       index off
  4653.       for invoices with customer = "john smith"
  4654.          invoices.customer = "John Smith Ltd"
  4655.          update record
  4656.       next
  4657.  
  4658.       If you prefix a loop which deletes records from a form then the
  4659.       form is packed at the end of the loop.
  4660.  
  4661.  
  4662.  
  4663.  
  4664.  
  4665.  
  4666.                                 - 73 -
  4667. ................................................................................
  4668.  
  4669.  
  4670.  
  4671.       Input Screen Format         METHOD          Input Screen Format
  4672.  
  4673.  
  4674.       All form and input screens can be presented either mounted in a
  4675.       window against a mottled background or exactly as drawn in form
  4676.       design. The windowing effect is done automatically if you leave
  4677.       a clear border around all text and fields. If you place fields
  4678.       or text anywhere against the edge of the screen (even invisible
  4679.       fields) then the window effect will not be invoked.
  4680.  
  4681.       If you do not want the window effect but you still wish to
  4682.       leave a clear border then you should place the invisible text
  4683.       character (ASCII 255) in the top left hand corner of the
  4684.       screen to disable it. To produce the invisible character hold
  4685.       down the Alt Key and type 255 on the numeric keypad.
  4686.  
  4687.  
  4688.  
  4689.  
  4690.  
  4691.  
  4692.  
  4693.  
  4694.  
  4695.  
  4696.  
  4697.  
  4698.  
  4699.  
  4700.  
  4701.  
  4702.  
  4703.  
  4704.  
  4705.  
  4706.  
  4707.  
  4708.  
  4709.  
  4710.  
  4711.  
  4712.  
  4713.  
  4714.  
  4715.  
  4716.  
  4717.  
  4718.  
  4719.  
  4720.  
  4721.  
  4722.  
  4723.  
  4724.  
  4725.  
  4726.  
  4727.                                 - 74 -
  4728. ................................................................................
  4729.  
  4730.  
  4731.  
  4732.       INSTALL FORM               UTILITY                 INSTALL FORM
  4733.  
  4734.  
  4735.       The "Install Form" utility is accessed from the Utilities menu.
  4736.       If you wish to include a form in one application which you
  4737.       designed in another then you cannot simply copy the files to
  4738.       the new applications directory as there will be no entry in the
  4739.       "Forms Directory" file.
  4740.  
  4741.       To install a form from another application - first get the
  4742.       forms DOS filename from that application then select "Install
  4743.       Form" from the utilities menu. You will be asked to supply the
  4744.       forms name and the full path and filename from where it is to
  4745.       be copied. Easy Base will then copy the forms definition file
  4746.       and make the appropriate entry in the "Forms Directory". It
  4747.       will then ask whether or not you wish the data to be copied
  4748.       from the original application.
  4749.  
  4750.       If you install a form from another application and it has
  4751.       "lookup" derivations or Choice List fields then you will have
  4752.       to create the relationships and choice lists in the new
  4753.       application. They are not automatically reproduced.
  4754.  
  4755.  
  4756.  
  4757.  
  4758.  
  4759.  
  4760.  
  4761.  
  4762.  
  4763.  
  4764.  
  4765.  
  4766.  
  4767.  
  4768.  
  4769.  
  4770.  
  4771.  
  4772.  
  4773.  
  4774.  
  4775.  
  4776.  
  4777.  
  4778.  
  4779.  
  4780.  
  4781.  
  4782.  
  4783.  
  4784.  
  4785.  
  4786.  
  4787.  
  4788.                                 - 75 -
  4789. ................................................................................
  4790.  
  4791.  
  4792.  
  4793.       INSTALL PRINTER            UTILITY              INSTALL PRINTER
  4794.  
  4795.  
  4796.       The "Install printer" utility is accessed from the Utilities
  4797.       menu. It can also be included in a user menu so that end users
  4798.       of finished applications can install their printer without
  4799.       access to the system menus.
  4800.  
  4801.       When you select "Install Printer" you are offered a choice of
  4802.       ten printer drivers - five for named printers and five generic
  4803.       drivers. The drivers supplied cover virtually all printers
  4804.       except daisy wheels.
  4805.  
  4806.       When you have chosen your printer driver Easy Base then asks
  4807.       for the parallel port number to which printer output is to be
  4808.       sent - one or two. Easy Base does not have a built in serial
  4809.       port printer output. If your printer only has a serial input
  4810.       then you must redirect a parallel port with the DOS "Mode"
  4811.       command.
  4812.  
  4813.       Easy Base then asks how much paper wastage there is at the top
  4814.       of the page. This is quite important as it is used in
  4815.       conjunction with the paper size in use to determine the
  4816.       "Bottom Margin" value, used for pagination in printed reports.
  4817.  
  4818.       You are then asked for the wastage at the left margin. This
  4819.       information is used in the format editor to display the right
  4820.       edge of the paper at the different print sizes. There are only
  4821.       two settings for wastage at the left margin - zero and ¼ inch.
  4822.       If you have a cartridge fed printer such as a Laser or Bubble
  4823.       Jet then it will almost certainly be ¼ inch. If you have a
  4824.       traction or manual feed then you will be able to adjust the
  4825.       left margin and you should set it to zero.
  4826.  
  4827.       Finally you are asked for the top margin required in printed
  4828.       reports. This can only be between the value set as the printers
  4829.       inherent wastage and one inch.  The value you set here will be
  4830.       the default top margin for all printouts. If you need a larger
  4831.       top margin for certain printouts then you must include blank
  4832.       lines in the page header of the procedures output format.
  4833.  
  4834.  
  4835.  
  4836.  
  4837.  
  4838.  
  4839.  
  4840.  
  4841.  
  4842.  
  4843.  
  4844.  
  4845.  
  4846.  
  4847.  
  4848.  
  4849.                                 - 76 -
  4850. ................................................................................
  4851.  
  4852.  
  4853.  
  4854.       INSTALL PROCEDURE          UTILITY            INSTALL PROCEDURE
  4855.  
  4856.  
  4857.       The "Install procedure" utility is accessed from the
  4858.       Utilities menu and allows you to install procedures which you
  4859.       designed in another application. It is used exactly like the
  4860.       "Install Form" utility previously described.
  4861.  
  4862.  
  4863.  
  4864.  
  4865.  
  4866.  
  4867.  
  4868.  
  4869.  
  4870.  
  4871.  
  4872.  
  4873.  
  4874.  
  4875.  
  4876.  
  4877.  
  4878.  
  4879.  
  4880.  
  4881.  
  4882.  
  4883.  
  4884.  
  4885.  
  4886.  
  4887.  
  4888.  
  4889.  
  4890.  
  4891.  
  4892.  
  4893.  
  4894.  
  4895.  
  4896.  
  4897.  
  4898.  
  4899.  
  4900.  
  4901.  
  4902.  
  4903.  
  4904.  
  4905.  
  4906.  
  4907.  
  4908.  
  4909.  
  4910.                                 - 77 -
  4911. ................................................................................
  4912.  
  4913.  
  4914.  
  4915.       INTEGER                   FIELD TYPE                    INTEGER
  4916.  
  4917.  
  4918.       Integer fields can have up to 14 digits and use a comma as the
  4919.       thousands separator.
  4920.  
  4921.       Although integer fields display integers they store the result
  4922.       of any division correct to 15 significant figures.
  4923.  
  4924.       See - Operators Arithmetic
  4925.  
  4926.  
  4927.  
  4928.  
  4929.  
  4930.  
  4931.  
  4932.  
  4933.  
  4934.  
  4935.  
  4936.  
  4937.  
  4938.  
  4939.  
  4940.  
  4941.  
  4942.  
  4943.  
  4944.  
  4945.  
  4946.  
  4947.  
  4948.  
  4949.  
  4950.  
  4951.  
  4952.  
  4953.  
  4954.  
  4955.  
  4956.  
  4957.  
  4958.  
  4959.  
  4960.  
  4961.  
  4962.  
  4963.  
  4964.  
  4965.  
  4966.  
  4967.  
  4968.  
  4969.  
  4970.  
  4971.                                 - 78 -
  4972. ................................................................................
  4973.  
  4974.  
  4975.  
  4976.       INTEXT                     FUNCTION                      INTEXT
  4977.  
  4978.  
  4979.       This function returns the starting character number of one
  4980.       length of text within another.
  4981.  
  4982.       Ex.    Intext(companyname," and ")
  4983.              < Returns 7 if companyname = "Turner and Smith"
  4984.  
  4985.       The intext function returns 0 if the second parameter is not
  4986.       found in the first.
  4987.  
  4988.       Ex.
  4989.  
  4990.       If intext(customers.companyname," Ltd") <> 0 then
  4991.          customers.Ltd  = "yes"
  4992.          update record
  4993.       end if
  4994.  
  4995.       Acceptable parameters:
  4996.  
  4997.       Text field/variable
  4998.       Any function returning a text value
  4999.  
  5000.  
  5001.  
  5002.  
  5003.  
  5004.  
  5005.  
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.  
  5012.  
  5013.  
  5014.  
  5015.  
  5016.  
  5017.  
  5018.  
  5019.  
  5020.  
  5021.  
  5022.  
  5023.  
  5024.  
  5025.  
  5026.  
  5027.  
  5028.  
  5029.  
  5030.  
  5031.  
  5032.                                 - 79 -
  5033. ................................................................................
  5034.  
  5035.  
  5036.  
  5037.       JOINTEXT                   FUNCTION                    JOINTEXT
  5038.  
  5039.  
  5040.       Ex.  Jointext(forename,surname)
  5041.  
  5042.       The jointext function takes any number of parameters.
  5043.  
  5044.       Ex.  Jointext("Mr ",forename," ",surname," Esq.")
  5045.       Ex.  Jointext(if(sex=male,"Mr ","Ms "),surname)
  5046.  
  5047.       The "jointext" function will also perform any arithmetic
  5048.       operations required for a text output.
  5049.  
  5050.       Ex. Jointext("The Gross price is ",netprice *120/100)
  5051.  
  5052.       The "jointext" function is also used for creating compound
  5053.       index fields.
  5054.  
  5055.       Ex. Jointext(reverse(zeropad(price,4,2)),stockitem)
  5056.  
  5057.       This creates a field whose index allows a stock file to be
  5058.       listed with stockitem in alphabetical order but grouped by
  5059.       price in reverse order.
  5060.  
  5061.       If you "Jointext" a date or time field you will get the date or
  5062.       time's numeric value not the date or time's string
  5063.       representation. (See Compound Index)
  5064.  
  5065.       By default the "Jointext" function strips trailing blank space
  5066.       characters from the texts being joined. If you wish to join
  5067.       text in a Text Block field so that the second text starts on a
  5068.       new line then you can force this by including Chr$(13) which
  5069.       Easy base uses as a "New Line" flag.
  5070.  
  5071.       Ex.
  5072.  
  5073.           Jointext(block1,chr$(13),block2)
  5074.  
  5075.           <The text from block2 will start on a new line>
  5076.  
  5077.       Ex.
  5078.  
  5079.           Jointext(block1,chr$(13),chr$(13),block2)
  5080.  
  5081.          <There will be a blank line between block1 and block2>
  5082.  
  5083.       Acceptable Parameters:
  5084.  
  5085.       Numeric expressions
  5086.       Quoted text
  5087.       Fields and variables
  5088.       Other nested functions
  5089.       System Values
  5090.  
  5091.  
  5092.  
  5093.                                 - 80 -
  5094. ................................................................................
  5095.  
  5096.  
  5097.  
  5098.       LEFTTEXT                   FUNCTION                    LEFTTEXT
  5099.  
  5100.  
  5101.       This function returns a specified number of characters from the
  5102.       start of a field or variable.
  5103.  
  5104.       Ex.   Lefttext(salutation,2)
  5105.             < returns "Mr" from "Mr Smith" or "Ms" from "Ms Smith"
  5106.  
  5107.       Ex.   Lefttext(datetext(system date),4)
  5108.             < Returns 12th , 20th Etc.>   (European date format)
  5109.  
  5110.  
  5111.  
  5112.  
  5113.       Acceptable parameters:
  5114.  
  5115.       Text field/variable
  5116.       Any function returning a text value
  5117.  
  5118.  
  5119.  
  5120.  
  5121.  
  5122.  
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.  
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.  
  5152.  
  5153.  
  5154.                                 - 81 -
  5155. ................................................................................
  5156.  
  5157.  
  5158.  
  5159.       LENGTHTEXT                 FUNCTION                  LENGTHTEXT
  5160.  
  5161.  
  5162.       This function returns the length of text in a field or variable
  5163.  
  5164.       Ex.   lengthtext(name)
  5165.             < Returns 4 if name = "Bill"  10 if name = "Bill Smith"
  5166.  
  5167.  
  5168.       Acceptable parameters:
  5169.  
  5170.       Text field/variable
  5171.       Any function returning a text value
  5172.  
  5173.  
  5174.  
  5175.  
  5176.  
  5177.  
  5178.  
  5179.  
  5180.  
  5181.  
  5182.  
  5183.  
  5184.  
  5185.  
  5186.  
  5187.  
  5188.  
  5189.  
  5190.  
  5191.  
  5192.  
  5193.  
  5194.  
  5195.  
  5196.  
  5197.  
  5198.  
  5199.  
  5200.  
  5201.  
  5202.  
  5203.  
  5204.  
  5205.  
  5206.  
  5207.  
  5208.  
  5209.  
  5210.  
  5211.  
  5212.  
  5213.  
  5214.  
  5215.                                 - 82 -
  5216. ................................................................................
  5217.  
  5218.  
  5219.  
  5220.       LINKING APPLICATIONS        METHOD         LINKING APPLICATIONS
  5221.  
  5222.  
  5223.       Procedures in one directory can access forms in another
  5224.       directory or disk by placing the external forms path in
  5225.       brackets immediately after the form name at the start of a For
  5226.       Loop.
  5227.  
  5228.       Ex.
  5229.  
  5230.       For payroll (c:\pay) with posted = "No"
  5231.          for purchaseledger new record
  5232.             copy all from payroll
  5233.          next
  5234.          payroll.posted = "Yes"
  5235.          update record
  5236.       next
  5237.  
  5238.       The above procedure, in an accounts application, imports data
  5239.       from a payroll application in C:\PAY and updates the "Posted"
  5240.       field in the payroll application.
  5241.  
  5242.       Ex.
  5243.  
  5244.       for sales (A:\) alias import
  5245.          for sales new record
  5246.            copy all from import
  5247.          next
  5248.       next
  5249.  
  5250.       The above procedure is used to import data transferred from one
  5251.       machine to another on floppy disk.
  5252.  
  5253.       Note:-
  5254.  
  5255.       1.   If transferring data on floppy disk the floppy must hold
  5256.       the forms .DAT and .DEF files together with the BASE.DIR from
  5257.       the source application. If you need to move large amounts of
  5258.       data on floppy it is much quicker to simply overwrite an import
  5259.       forms .DAT file and then pack it to rewrite the indices.
  5260.  
  5261.  
  5262.  
  5263.  
  5264.  
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.  
  5276.                                 - 83 -
  5277. ................................................................................
  5278.  
  5279.  
  5280.  
  5281.       LIST FILE NAMES            UTILITY              LIST FILE NAMES
  5282.  
  5283.  
  5284.       When you give a name to a Form or Procedure in Easy Base it is
  5285.       not the actual DOS file name used. A Form has separate DOS
  5286.       files for its definition, its data and its indices. Similarly a
  5287.       procedure can have one or two files depending on whether or not
  5288.       it has an input screen. Within an application you never need to
  5289.       know the DOS filenames as Easy Base takes care of all disk
  5290.       activity in the background.
  5291.  
  5292.       You may however need to know the DOS filenames if you intend to
  5293.       export data to another program or copy a Form or Procedure from
  5294.       one application to another.
  5295.  
  5296.       You can list the DOS filenames for Forms and reports with the
  5297.       "List File Names" utility.
  5298.  
  5299.       The "List File Names" utility can also be called from a user
  5300.       menu without accessing the system.
  5301.  
  5302.  
  5303.  
  5304.  
  5305.  
  5306.  
  5307.  
  5308.  
  5309.  
  5310.  
  5311.  
  5312.  
  5313.  
  5314.  
  5315.  
  5316.  
  5317.  
  5318.  
  5319.  
  5320.  
  5321.  
  5322.  
  5323.  
  5324.  
  5325.  
  5326.  
  5327.  
  5328.  
  5329.  
  5330.  
  5331.  
  5332.  
  5333.  
  5334.  
  5335.  
  5336.  
  5337.                                 - 84 -
  5338. ................................................................................
  5339.  
  5340.  
  5341.  
  5342.       LIST VARIABLES         PROCEDURE COMMAND         LIST VARIABLES
  5343.  
  5344.  
  5345.       The "List Variables" command is a de-bugging facility for
  5346.       developers. If a procedure is not producing the expected
  5347.       results you can interrupt it at any point and view the contents
  5348.       of all fields and variables in memory at that point.
  5349.  
  5350.       Ex.
  5351.  
  5352.       for authors with surname in order
  5353.          if authors.surname = "kippling" then list variables
  5354.          for books with author = authors.surname
  5355.             print list items
  5356.          next
  5357.       next
  5358.  
  5359.  
  5360.  
  5361.  
  5362.  
  5363.  
  5364.  
  5365.  
  5366.  
  5367.  
  5368.  
  5369.  
  5370.  
  5371.  
  5372.  
  5373.  
  5374.  
  5375.  
  5376.  
  5377.  
  5378.  
  5379.  
  5380.  
  5381.  
  5382.  
  5383.  
  5384.  
  5385.  
  5386.  
  5387.  
  5388.  
  5389.  
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.                                 - 85 -
  5399. ................................................................................
  5400.  
  5401.  
  5402.  
  5403.       LOOKUP                     FUNCTION                      LOOKUP
  5404.  
  5405.  
  5406.       Ex. Lookup(customers,name)
  5407.  
  5408.       The first parameter is the name of a relationship defined in
  5409.       the relationships form. The second parameter is the name of the
  5410.       field in the secondary file whose value is to be looked up. The
  5411.       parameters are absolute. You cannot supply them as variables
  5412.       fields or the results of other functions.
  5413.  
  5414.       Unlike other functions, "lookup" can only be used in a field
  5415.       derivation, entry conditions and mandatory conditions. It has
  5416.       no meaning in the procedure language.
  5417.  
  5418.       A full description of how to use the Lookup function is given
  5419.       in the users manual
  5420.  
  5421.       Acceptable parameters
  5422.  
  5423.       1.   Relationship name
  5424.       2.   Field Name
  5425.  
  5426.  
  5427.  
  5428.  
  5429.  
  5430.  
  5431.  
  5432.  
  5433.  
  5434.  
  5435.  
  5436.  
  5437.  
  5438.  
  5439.  
  5440.  
  5441.  
  5442.  
  5443.  
  5444.  
  5445.  
  5446.  
  5447.  
  5448.  
  5449.  
  5450.  
  5451.  
  5452.  
  5453.  
  5454.  
  5455.  
  5456.  
  5457.  
  5458.  
  5459.                                 - 86 -
  5460. ................................................................................
  5461.  
  5462.  
  5463.  
  5464.       LOWER                      FUNCTION                       LOWER
  5465.  
  5466.  
  5467.       Returns the lower case of the parameter.
  5468.  
  5469.       Ex. lower(partname)
  5470.  
  5471.  
  5472.       Ex.
  5473.  
  5474.       Heading = Jointext("List of parts supplied by ",lower(makers.
  5475.       name))
  5476.  
  5477.  
  5478.       Acceptable parameters:
  5479.  
  5480.       Quoted text
  5481.       Text Field/variable
  5482.  
  5483.  
  5484.  
  5485.  
  5486.  
  5487.  
  5488.  
  5489.  
  5490.  
  5491.  
  5492.  
  5493.  
  5494.  
  5495.  
  5496.  
  5497.  
  5498.  
  5499.  
  5500.  
  5501.  
  5502.  
  5503.  
  5504.  
  5505.  
  5506.  
  5507.  
  5508.  
  5509.  
  5510.  
  5511.  
  5512.  
  5513.  
  5514.  
  5515.  
  5516.  
  5517.  
  5518.  
  5519.  
  5520.                                 - 87 -
  5521. ................................................................................
  5522.  
  5523.  
  5524.  
  5525.       MAKEDATE                   FUNCTION                    MAKEDATE
  5526.  
  5527.  
  5528.       The Easy base Date field is a six digit field which covers the
  5529.       century from 1 Jan 1981 to 31 Dec 2080 and upon which you can
  5530.       perform addition and subtraction operations in days.
  5531.  
  5532.       Ex. Duedate = Invoicedate + 30
  5533.  
  5534.       In order to provide this facility the date is held as a numeric
  5535.       value. You can only type a date directly into a date field.
  5536.  
  5537.       If you need to enter a date in a derivation or in a procedure
  5538.       code you must use the "makedate" function.
  5539.  
  5540.       Ex.  Makedate(5,11,95)
  5541.           < Returns 05/11/95 >
  5542.  
  5543.       Ex.  Nextmonth = month(system date)+1
  5544.            if nextmonth = 13 then nextmonth = 1
  5545.            Nextdelivery = makedate(1,nextmonth,year(system date))
  5546.            < Returns the date of the first of next month >
  5547.  
  5548.       Acceptable parameters
  5549.  
  5550.       Numeric value
  5551.       Numeric expression
  5552.       Numeric field/variable
  5553.       Any other function which returns a numeric value
  5554.  
  5555.  
  5556.  
  5557.  
  5558.  
  5559.  
  5560.  
  5561.  
  5562.  
  5563.  
  5564.  
  5565.  
  5566.  
  5567.  
  5568.  
  5569.  
  5570.  
  5571.  
  5572.  
  5573.  
  5574.  
  5575.  
  5576.  
  5577.  
  5578.  
  5579.  
  5580.  
  5581.                                 - 88 -
  5582. ................................................................................
  5583.  
  5584.  
  5585.  
  5586.       MAKETIME                   FUNCTION                    MAKETIME
  5587.  
  5588.  
  5589.       The value of a time field in Easy base is held as a numeric
  5590.       value representing the number of seconds past midnight. This
  5591.       allows you to perform addition and subtraction operations in
  5592.       seconds.
  5593.  
  5594.       Ex. Timetaken = Round(Endtime - Starttime / 60)
  5595.           < This returns the time taken in minutes >
  5596.  
  5597.       You can only enter a time directly into a time field.
  5598.  
  5599.       If you need to enter a time in a field derivation or in a
  5600.       procedure code you must use the "Maketime" function.
  5601.  
  5602.       Ex. Time = Maketime(20,20,00)
  5603.            <  returns 20:20:00  >
  5604.  
  5605.  
  5606.       Acceptable parameters:
  5607.  
  5608.       Numeric value
  5609.       Numeric expression
  5610.       Numeric field/variable
  5611.       Any other function which returns a numeric value
  5612.  
  5613.  
  5614.  
  5615.  
  5616.  
  5617.  
  5618.  
  5619.  
  5620.  
  5621.  
  5622.  
  5623.  
  5624.  
  5625.  
  5626.  
  5627.  
  5628.  
  5629.  
  5630.  
  5631.  
  5632.  
  5633.  
  5634.  
  5635.  
  5636.  
  5637.  
  5638.  
  5639.  
  5640.  
  5641.  
  5642.                                 - 89 -
  5643. ................................................................................
  5644.  
  5645.  
  5646.  
  5647.       Manual Feed            Procedure Command            Manual Feed
  5648.  
  5649.  
  5650.       When you set the paper type in use from the utilities menu, you
  5651.       tell Easy Base whether you have a manual or continuous feed
  5652.       printer. This is then used throughout all procedures.
  5653.  
  5654.       If your printer has a continuous feed but a particular
  5655.       procedure requires manual eg label or envelope printing you can
  5656.       force Easy Base to pause after each page without changing the
  5657.       default by issuing the Manual Feed command within the procedure
  5658.       code.
  5659.  
  5660.       Declare output fields
  5661.          mail.name :mail.address
  5662.       end
  5663.       manual feed
  5664.       for mail
  5665.          print envelope
  5666.       next
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.  
  5684.  
  5685.  
  5686.  
  5687.  
  5688.  
  5689.  
  5690.  
  5691.  
  5692.  
  5693.  
  5694.  
  5695.  
  5696.  
  5697.  
  5698.  
  5699.  
  5700.  
  5701.  
  5702.  
  5703.                                 - 90 -
  5704. ................................................................................
  5705.  
  5706.  
  5707.  
  5708.       MATHS                      FUNCTION                       MATHS
  5709.  
  5710.  
  5711.       The following maths functions can be used anywhere in Easy Base
  5712.       code or field derivations.
  5713.  
  5714.       Log()
  5715.       Log10()
  5716.       Sqrt()
  5717.       Sin()
  5718.       Cos()
  5719.       Tan()
  5720.       Atan()
  5721.       Deg-rad()     converts degrees to radians
  5722.       Rad-deg()     converts radians to degrees
  5723.       Exp()         Raises e (the base of natural logarithms) to the
  5724.                     power of the parameter
  5725.  
  5726.  
  5727.       Acceptable parameters:
  5728.  
  5729.       Numeric value
  5730.       Numeric expression
  5731.       Numeric field/variable
  5732.       Any function returning a numeric value
  5733.  
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739.  
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.  
  5746.  
  5747.  
  5748.  
  5749.  
  5750.  
  5751.  
  5752.  
  5753.  
  5754.  
  5755.  
  5756.  
  5757.  
  5758.  
  5759.  
  5760.  
  5761.  
  5762.  
  5763.  
  5764.                                 - 91 -
  5765. ................................................................................
  5766.  
  5767.  
  5768.  
  5769.       MAXIMIZING SPEED            METHOD             MAXIMIZING SPEED
  5770.  
  5771.  
  5772.       Because the procedures you create in Easy Base have to be
  5773.       interpreted each time they are run they will tend to be slower
  5774.       than similar routines created in a compiled system. This is the
  5775.       unavoidable cost of ease of use. You can increase speed vastly
  5776.       by having the best DOS environment and by the way in which you
  5777.       write procedure code.
  5778.  
  5779.       DOS Environment.
  5780.  
  5781.       1.   Do not use a disk compression system.
  5782.  
  5783.       2.   Always load "Fastopen"  - The default settings are fine -
  5784.            just add the line "fastopen C:" to your AUTOEXEC.BAT file.
  5785.  
  5786.       3.   Use a Disk Cacheing system - The more memory you can
  5787.            allocate to it the better. Easy Software recommends
  5788.            PC-Cache from Centre Point with 2 Megabytes of expanded
  5789.            memory allocated. Smartdrive (Version supplied with
  5790.            Windows 3.1) was slightly faster but caused widespread
  5791.            disk corruptions during test "Power Failures".
  5792.       4.   Do not run any TSR programs (Especially Virus Checkers).
  5793.  
  5794.       Procedure Code.
  5795.  
  5796.       Avoid making calculations and derivations within "For" loops in
  5797.       procedures.
  5798.  
  5799.       If, for example, you had a form in which was recorded the
  5800.       length, breadth and depth of various blocks and you knew that
  5801.       at some point you would write a procedure which listed their
  5802.       volume. Add a field for volume to the form and derive it from
  5803.       the other fields. When you write the procedure you will simply
  5804.       list this field. If the field had not been added to the form
  5805.       then you would have to calculate its value on each iteration of
  5806.       the "For" loop.
  5807.  
  5808.       The time taken to derive each individual "Volume" field during
  5809.       record entry will not be noticeable but the time taken to
  5810.       derive the volume for every record during the procedure will.
  5811.  
  5812.       Keep "Running statistics".  If your program requires statistics
  5813.       derived from many hundreds or even thousands of records then
  5814.       having to wait for a procedure which calculates them each time
  5815.       you want up to date figures is a real pain.
  5816.  
  5817.       To keep "running statistics" create a form with a field for
  5818.       each statistic you require and enter a single record with zero
  5819.       values in each field. Make all entries, modifications and
  5820.       deletions to your data via procedures and you can update your
  5821.       statistics each time a record is added, modified or deleted.
  5822.  
  5823.       Example on next page.
  5824.  
  5825.                                 - 92 -
  5826. ................................................................................
  5827.  
  5828.  
  5829.  
  5830.       MAXIMIZING SPEED            METHOD             MAXIMIZING SPEED
  5831.  
  5832.  
  5833.       The following procedure code enters a record (collected via the
  5834.       input screen) to a purchases ledger and updates statistics used
  5835.       in the profit and loss account. It also updates the balance for
  5836.       the suppliers account.
  5837.  
  5838.       pause off : Escape off
  5839.       for purchases new record
  5840.          copy all from input
  5841.       next
  5842.       for stats
  5843.          if input.type = "Invoice" then
  5844.             stats.creditors = stats.creditors + input.amount
  5845.          end if
  5846.          if input.type = "CreditNote" then
  5847.             stats.creditors = stats.creditors - input.amount
  5848.          end if
  5849.          if input.type = "Payment" then
  5850.             stats.creditors = stats.creditors - input.amount
  5851.             if input.paidby = "cash" then
  5852.                stats.cashbalance = stats.cashbalance - input.amount
  5853.             else
  5854.                stats.bankbalance = stats.bankbalance - input.amount
  5855.             end if
  5856.          end if
  5857.       next
  5858.       for ACbalances with supplier = input supplier
  5859.          if input.type = "Invoice" then
  5860.             ACbalances.balance = ACbalances.balance + input.amount
  5861.          else
  5862.             ACbalances.balance = ACbalances.balance - input.amount
  5863.          end if
  5864.       next
  5865.  
  5866.       Whenever you need to know statistics for "Debtors", "Cash
  5867.       Balance" etc you can produce them instantly with a procedure
  5868.       which simply lists data from the statistics forms.
  5869.  
  5870.       Whenever you use running statistics in this way you should also
  5871.       create a procedure which does calculate them from the raw data.
  5872.       If you ever, for one reason or another, have to edit data
  5873.       directly in "Data entry" then your "running statistics" will no
  5874.       longer be accurate. You can run this procedure to correct them.
  5875.  
  5876.  
  5877.  
  5878.  
  5879.  
  5880.  
  5881.  
  5882.  
  5883.  
  5884.  
  5885.  
  5886.                                 - 93 -
  5887. ................................................................................
  5888.  
  5889.  
  5890.  
  5891.       MENU CALLS               MENU FUNCTION               MENU CALLS
  5892.  
  5893.  
  5894.       In addition to the utilities which can be called from user
  5895.       menus the following calls can also be made.
  5896.  
  5897.       Run Procedure :   Runs a pre-defined procedure
  5898.  
  5899.       Last Output   :   Recalls the output from a procedure
  5900.  
  5901.       Data Entry    :   Allows direct access to a form
  5902.  
  5903.       User Menu     :   Calls another user menu
  5904.  
  5905.       System Menus  :   Calls the Easy Base System menus
  5906.  
  5907.       Run external program :  Shells to another program - You cannot
  5908.       run another major program from within Easy Base - there is very
  5909.       little spare memory - this call is however useful for calling
  5910.       batch files which export data to other programs for later use.
  5911.  
  5912.  
  5913.  
  5914.  
  5915.  
  5916.  
  5917.  
  5918.  
  5919.  
  5920.  
  5921.  
  5922.  
  5923.  
  5924.  
  5925.  
  5926.  
  5927.  
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.  
  5934.  
  5935.  
  5936.  
  5937.  
  5938.  
  5939.  
  5940.  
  5941.  
  5942.  
  5943.  
  5944.  
  5945.  
  5946.  
  5947.                                 - 94 -
  5948. ................................................................................
  5949.  
  5950.  
  5951.  
  5952.       MIDTEXT                    FUNCTION                     MIDTEXT
  5953.  
  5954.  
  5955.       This function returns a given number of characters from a given
  5956.       starting point in a field or variable.
  5957.  
  5958.       Ex.   Midtext(fileref,4,4)
  5959.             < Returns "Bill" from "TR/Bill/1243"
  5960.  
  5961.  
  5962.       Acceptable parameters:
  5963.  
  5964.       Text field/variable
  5965.       Any function returning a text value
  5966.  
  5967.  
  5968.  
  5969.  
  5970.  
  5971.  
  5972.  
  5973.  
  5974.  
  5975.  
  5976.  
  5977.  
  5978.  
  5979.  
  5980.  
  5981.  
  5982.  
  5983.  
  5984.  
  5985.  
  5986.  
  5987.  
  5988.  
  5989.  
  5990.  
  5991.  
  5992.  
  5993.  
  5994.  
  5995.  
  5996.  
  5997.  
  5998.  
  5999.  
  6000.  
  6001.  
  6002.  
  6003.  
  6004.  
  6005.  
  6006.  
  6007.  
  6008.                                 - 95 -
  6009. ................................................................................
  6010.  
  6011.  
  6012.  
  6013.       MINUTES                    FUNCTION                     MINUTES
  6014.  
  6015.  
  6016.       This function returns the minutes number from the time field
  6017.       parameter.
  6018.  
  6019.       Ex.    minutes(system time)
  6020.  
  6021.       Ex.
  6022.  
  6023.       Unitsperhour = rounddown(60/(minutes(endtime)-
  6024.       minutes(starttime)))
  6025.  
  6026.       Acceptable parameters:
  6027.  
  6028.       System time
  6029.       Time field
  6030.       Maketime function
  6031.       Time expression
  6032.  
  6033.  
  6034.  
  6035.  
  6036.  
  6037.  
  6038.  
  6039.  
  6040.  
  6041.  
  6042.  
  6043.  
  6044.  
  6045.  
  6046.  
  6047.  
  6048.  
  6049.  
  6050.  
  6051.  
  6052.  
  6053.  
  6054.  
  6055.  
  6056.  
  6057.  
  6058.  
  6059.  
  6060.  
  6061.  
  6062.  
  6063.  
  6064.  
  6065.  
  6066.  
  6067.  
  6068.  
  6069.                                 - 96 -
  6070. ................................................................................
  6071.  
  6072.  
  6073.  
  6074.       MOD                        FUNCTION                         MOD
  6075.  
  6076.  
  6077.       The Mod function returns the remainder of an integer division
  6078.  
  6079.       Ex. surplus rounds = mod(bullets,soldiers * ammoissue)
  6080.  
  6081.  
  6082.       Ex.
  6083.  
  6084.       for Historydates
  6085.          historydates.leapyear = "No"
  6086.          if mod(historydates.year,4) = 0 then
  6087.             historydates.leapyear = "Yes"
  6088.             update record
  6089.          end if
  6090.       next
  6091.       < This example fills a new field "leapyear" which has been
  6092.       added to the "Historydates" form after data has been entered>
  6093.  
  6094.       Acceptable parameters:
  6095.  
  6096.       Numeric value
  6097.       Numeric expression
  6098.       Numeric field/variable
  6099.       Any other function which returns a numeric value
  6100.  
  6101.  
  6102.  
  6103.  
  6104.  
  6105.  
  6106.  
  6107.  
  6108.  
  6109.  
  6110.  
  6111.  
  6112.  
  6113.  
  6114.  
  6115.  
  6116.  
  6117.  
  6118.  
  6119.  
  6120.  
  6121.  
  6122.  
  6123.  
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.  
  6130.                                 - 97 -
  6131. ................................................................................
  6132.  
  6133.  
  6134.  
  6135.       MONTH                      FUNCTION                       MONTH
  6136.  
  6137.  
  6138.       This function returns the month number from a date parameter.
  6139.  
  6140.       Ex.    Month(system date)
  6141.  
  6142.       Ex.    Month(birthdate)
  6143.  
  6144.  
  6145.       Acceptable parameters
  6146.  
  6147.       System date
  6148.       Date field
  6149.       Makedate function
  6150.       Date expression
  6151.  
  6152.  
  6153.  
  6154.  
  6155.  
  6156.  
  6157.  
  6158.  
  6159.  
  6160.  
  6161.  
  6162.  
  6163.  
  6164.  
  6165.  
  6166.  
  6167.  
  6168.  
  6169.  
  6170.  
  6171.  
  6172.  
  6173.  
  6174.  
  6175.  
  6176.  
  6177.  
  6178.  
  6179.  
  6180.  
  6181.  
  6182.  
  6183.  
  6184.  
  6185.  
  6186.  
  6187.  
  6188.  
  6189.  
  6190.  
  6191.                                 - 98 -
  6192. ................................................................................
  6193.  
  6194.  
  6195.  
  6196.       MULTIPLE COLUMNS            METHOD             MULTIPLE COLUMNS
  6197.  
  6198.  
  6199.       You may occasionally need to list data in order but in more
  6200.       than one column. Indexes for technical manuals are a common
  6201.       example. It would be nice if you could send the printer head
  6202.       back to the top of the page for each column but you can't. You
  6203.       must therefore get all the data for each horizontal line into
  6204.       memory at the same time and then print it.
  6205.  
  6206.       The following example prints the "Title" field from a "Films"
  6207.       form in alphabetic order in two columns with fifty lines on
  6208.       each page. To do this a field "No" is added to the form. This
  6209.       is an integer field and it is indexed.
  6210.  
  6211.       declare output fields
  6212.          films.title : righttitle
  6213.       end
  6214.       declare variables
  6215.          x as number  : y as number : lasttitle as text
  6216.       end
  6217.       '................UPDATE THE No FIELD......
  6218.       for films with title in order
  6219.          y = total records
  6220.          x = x + 1
  6221.          display status "Updating No field record" + x + "of" + y
  6222.          films.No = x
  6223.          update record
  6224.       next
  6225.       '.................PRINT IN TWO COLUMNS.................
  6226.       x = 0                        'reuse x as counter
  6227.       do
  6228.          for films with title > lasttitle
  6229.             x = x + 1
  6230.             for films alias col2 with No = films.No + 50
  6231.               righttitle = col2.title
  6232.             next
  6233.             print list items
  6234.             lasttitle = righttitle : righttitle = blank
  6235.             if mod(x,50) = 0 then
  6236.                page feed : Exit for
  6237.             end if
  6238.          next
  6239.          if lasttitle = blank then exit do
  6240.       loop
  6241.  
  6242.       ........................Format..................
  6243.  
  6244.       .list items
  6245.             { Films.title field  }      {  Righttitle Field  }
  6246.       .end
  6247.  
  6248.  
  6249.  
  6250.  
  6251.  
  6252.                                 - 99 -
  6253. ................................................................................
  6254.  
  6255.  
  6256.  
  6257.       MULTIPLE LINES         PROCEDURE COMMAND         MULTIPLE LINES
  6258.  
  6259.  
  6260.       You can place multiple code instructions on a single line of
  6261.       the code editor by separating them with a colon.
  6262.  
  6263.       Ex.
  6264.  
  6265.       for ledger with lineno = input.lineno
  6266.          ledger.net = input.net:ledger.vat = input.vat
  6267.          ledger.acno = input.acno:ledger.gross = input.gross
  6268.          update record
  6269.       next
  6270.  
  6271.  
  6272.  
  6273.  
  6274.  
  6275.  
  6276.  
  6277.  
  6278.  
  6279.  
  6280.  
  6281.  
  6282.  
  6283.  
  6284.  
  6285.  
  6286.  
  6287.  
  6288.  
  6289.  
  6290.  
  6291.  
  6292.  
  6293.  
  6294.  
  6295.  
  6296.  
  6297.  
  6298.  
  6299.  
  6300.  
  6301.  
  6302.  
  6303.  
  6304.  
  6305.  
  6306.  
  6307.  
  6308.  
  6309.  
  6310.  
  6311.  
  6312.  
  6313.                                 - 100 -
  6314. ................................................................................
  6315.  
  6316.  
  6317.  
  6318.       Next Batch             Procedure Command             Next Batch
  6319.  
  6320.  
  6321.       The Next Batch command resets the batch menu pointer from
  6322.       within a procedure. By using the Next Batch command you can
  6323.       cause a batch of procedures to repeat without returning to the
  6324.       menu in the same way that you can repeat a single procedure
  6325.       with an input screen.
  6326.  
  6327.       For example, in a variable length invoicing system you might
  6328.       have three procedures on a batch menu. The first procedure
  6329.       selects the current customer and invoice number, the second
  6330.       writes invoice lines to the lineitems form and the third prints
  6331.       the invoice. To have the entire process repeated after each
  6332.       invoice the last line of the last procedure should be:
  6333.  
  6334.       Next Batch 1
  6335.  
  6336.       Similarly, if the user inadvertently selects the wrong customer
  6337.       in the first procedure you can use an input screen field in the
  6338.       second to return to the first.
  6339.  
  6340.       If input.reselect = "yes" then Next Batch 1
  6341.  
  6342.       By using Next Batch and Global Number you can create a batch
  6343.       menu which reacts like a single procedure repeating until the
  6344.       Escape key is pressed.
  6345.  
  6346.       To exit from a batch of procedures on the escape key, set
  6347.       Global Number to 1 in the first procedure and to 0 in the last.
  6348.       Add a procedure immediately after the first with the code:-
  6349.  
  6350.       If Global Number = 0 then exit batch menu
  6351.  
  6352.  
  6353.  
  6354.  
  6355.  
  6356.  
  6357.  
  6358.  
  6359.  
  6360.  
  6361.  
  6362.  
  6363.  
  6364.  
  6365.  
  6366.  
  6367.  
  6368.  
  6369.  
  6370.  
  6371.  
  6372.  
  6373.  
  6374.                                 - 101 -
  6375. ................................................................................
  6376.  
  6377.  
  6378.  
  6379.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  6380.  
  6381.  
  6382.       If you want to print procedure output on both sides of the
  6383.       paper then, unless you have a VERY expensive printer, the only
  6384.       way to achieve this is to print the odd pages, turn your paper
  6385.       over and print the even pages.  For a short report you can do
  6386.       this by setting paper feed to "Manual" from the utilities menu
  6387.       and turning each sheet over individually. If, however, you have
  6388.       a cut sheet feeder or a cartridge fed printer it is much
  6389.       quicker to print all the odd pages, turn them all over and then
  6390.       print all the even pages.
  6391.  
  6392.       To do this in Easy Base, issue the command "Odd Page Print"
  6393.       immediately before the print output and "Even Page Print"
  6394.       immediately after it.
  6395.  
  6396.       declare output fields
  6397.          customers.name : customers.phone
  6398.       end
  6399.       odd page print
  6400.       for customers with surname in order
  6401.          if bottom margin < .75 then page feed
  6402.          print list items
  6403.       next
  6404.       even page print    '(Easy Base pauses here till you are ready)
  6405.  
  6406.       If you will be binding your printed report down the left hand
  6407.       edge then you will need a larger left margin on the odd pages
  6408.       than on the even. If you start odd page printing with the
  6409.       command "Odd Page Print for Binding" then Easy Base will add
  6410.       half an inch to the format left margin when it prints the odd
  6411.       pages. You cannot alter the fixed value of half an inch but if
  6412.       you create your output format with a left margin of half an
  6413.       inch(suitable for the even pages) and print for binding, you
  6414.       will find that the resulting output suits most office binding
  6415.       systems.
  6416.  
  6417.       If you use Odd/Even page printing then it is important that you
  6418.       realize it is achieved by running the portion of your procedure
  6419.       between the "Odd Page Print" and "Even Page Print" twice -
  6420.       simply cancelling output to the printer at the appropriate
  6421.       times.  You must not, therefore include any commands which add,
  6422.       update or delete records between the commands. If you do they
  6423.       will be performed twice. Similarly if you are running a loop
  6424.       counter during the print process then it will have double the
  6425.       expected value after the "Even Page Print" command.
  6426.  
  6427.       The system value "Page Number" is reset to one at the "Even
  6428.       Page Print" command. If you include two separate sets of odd
  6429.       and even printing in a single procedure then you cannot use
  6430.       "Page Number" to number the second printout. You can of course
  6431.       use an ad hoc field. Just remember to reset it to one
  6432.       immediately before the "Even Page Print" command.
  6433.  
  6434.  
  6435.                                 - 102 -
  6436. ................................................................................
  6437.  
  6438.  
  6439.  
  6440.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  6441.  
  6442.  
  6443.       This document was written in an Easy Base form "Ref" which has
  6444.       fields "Name", "Type", "Pageno" "Topicpage" and three text
  6445.       block fields "T1", "T2" and "T3". Each record holds one page of
  6446.       the reference manual and the pages were entered in no
  6447.       particular order. The following procedure was used to number,
  6448.       sort, index and print the manual.
  6449.  
  6450.       declare output fields
  6451.          ref.name : ref.type :ref.pageno
  6452.          ref.t1 : ref.t2 : ref.t3 : type : name
  6453.       end
  6454.       declare variables
  6455.          x as number : y as number
  6456.          namelen as number : typelen as number
  6457.       end
  6458.       '.....................NUMBER REFERENCE PAGES....
  6459.       for ref with name in order
  6460.          y = total records
  6461.          x = x + 1
  6462.          display status "Numbering page" + x + "of" + y
  6463.          ref.pageno = x : update record
  6464.       next
  6465.       odd page print for binding
  6466.       '...............PRINT COMMANDS INDEX........
  6467.       bold on : print commandheader : bold off
  6468.       for ref with type = "procedure command"
  6469.          subindex name
  6470.       next
  6471.       for ref with subindex in order
  6472.          if topicpage > 1 then skiprec  'only first page
  6473.          ref.name = proper(ref.name)    'of each topic listed
  6474.          print commands
  6475.       next
  6476.       '..............PRINT SYSTEM VALUES INDEX...
  6477.       bold on : print valuesheader : bold off
  6478.       for ref with type = "system value"
  6479.          subindex name
  6480.       next
  6481.       for ref with subindex in order
  6482.          if topicpage > 1  then skiprec
  6483.          ref.name = proper(ref.name)
  6484.          print values
  6485.       next
  6486.       page feed       '... eject first index page
  6487.  
  6488.       '......... subsequent index pages are produced with exactly
  6489.       '........ the sane code as above and are omitted for clarity.
  6490.  
  6491.       '......................MAIN REFERENCE.............
  6492.       page feed
  6493.       for ref with name in order
  6494.          namelen = lengthtext(ref.name)
  6495.  
  6496.                                 - 103 -
  6497. ................................................................................
  6498.  
  6499.  
  6500.  
  6501.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  6502.  
  6503.  
  6504.          typelen = lengthtext(ref.type)
  6505.          '....centre justify type
  6506.          type = jointext(stringof((20-typelen)/2,chr$(255)),ref.type)
  6507.          '....right justify name
  6508.          name = jointext(stringof(20-namelen,chr$(255)),ref.name)
  6509.          bold on : print refheader : bold off  'type and names fields
  6510.          print list items                      't1, t2, t3
  6511.          bold on print reffoot                 'pageno
  6512.          page feed
  6513.       next
  6514.       even page print
  6515.  
  6516.  
  6517.  
  6518.  
  6519.  
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.  
  6530.  
  6531.  
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.  
  6538.  
  6539.  
  6540.  
  6541.  
  6542.  
  6543.  
  6544.  
  6545.  
  6546.  
  6547.  
  6548.  
  6549.  
  6550.  
  6551.  
  6552.  
  6553.  
  6554.  
  6555.  
  6556.  
  6557.                                 - 104 -
  6558. ................................................................................
  6559.  
  6560.  
  6561.  
  6562.       Open                     File Command                      Open
  6563.  
  6564.  
  6565.       The "Open" command is used to open a non-Easy Base file.
  6566.  
  6567.       The filename can be supplied within quotes or as a text
  6568.       variable or field.
  6569.  
  6570.       The filename can include a complete path. If a path is not
  6571.       included then the file is opened in the Easy Base System
  6572.       directory.
  6573.  
  6574.       If the filename supplied is that of an existing file, that file
  6575.       is opened for access with the Read or Write commands. If there
  6576.       is no file with the supplied filename then a new file with that
  6577.       name is created and opened.
  6578.  
  6579.       Ex.
  6580.  
  6581.       Open "C:\config.sys"
  6582.  
  6583.       Open Files.name
  6584.  
  6585.       Open jointext("C:\wp\",input.filename)
  6586.  
  6587.       See also: Close, Seek, Read, Write, Find, Erase
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.  
  6596.  
  6597.  
  6598.  
  6599.  
  6600.  
  6601.  
  6602.  
  6603.  
  6604.  
  6605.  
  6606.  
  6607.  
  6608.  
  6609.  
  6610.  
  6611.  
  6612.  
  6613.  
  6614.  
  6615.  
  6616.  
  6617.  
  6618.                                 - 105 -
  6619. ................................................................................
  6620.  
  6621.  
  6622.  
  6623.       OPERATORS                 ARITHMETIC                  OPERATORS
  6624.  
  6625.  
  6626.       The arithmetic operators used in Easy Base are:-
  6627.  
  6628.       +   (addition)
  6629.  
  6630.       -   (subtraction and negation)
  6631.  
  6632.       *   (multiplication)
  6633.  
  6634.       /   (division)
  6635.  
  6636.       ^   (exponentiation)
  6637.  
  6638.       Where there are multiple operators in a derivation they are
  6639.       processed with the following precedence:-
  6640.  
  6641.       1.   Exponentiation
  6642.       2.   Negation
  6643.       3.   Multiplication and Division
  6644.       4.   Addition and Subtraction
  6645.  
  6646.       The default precedence can be altered by the use of
  6647.       parenthesis.
  6648.  
  6649.            Easy base does not perform Integer Arithmetic.
  6650.  
  6651.       When a numeric field shows the result of a division the
  6652.       "displayed" number is "truncated" to an integer in Integer
  6653.       fields and has the last digit rounded in Fixed Point and
  6654.       Floating Point fields.  The "Stored" value which is used in any
  6655.       further calculations, however, is always correct to 15
  6656.       significant figures irrelevant of field type.  For Example: If
  6657.       three fields x,y and z are defined as integers, y is derived as
  6658.       x/4 and z is derived as y*4 then when 9 is entered in x, y will
  6659.       derive as 2 but z will derive as 9 because it multiplies the
  6660.       "stored value" of 2.25 by 4 not the displayed value of 2.
  6661.  
  6662.       Handling arithmetic in this way means that, by default there
  6663.       are no rounding errors. This has several advantages not least
  6664.       that currency values need only ever be defined to two decimal
  6665.       places.
  6666.  
  6667.       It does mean, however, that should you require rounding errors
  6668.       to be carried forward you must use one of the Easy Base
  6669.       rounding functions on the result of any intermediate division.
  6670.  
  6671.       In the above example, had y been derived as "round(x/4)" then z
  6672.       would derive as 8.
  6673.  
  6674.       If a fourth field had the formula:- if(y = 2,5,10) it would
  6675.       only derive as 5 if y had been rounded or if 8 had been entered
  6676.       in x.
  6677.  
  6678.  
  6679.                                 - 106 -
  6680. ................................................................................
  6681.  
  6682.  
  6683.  
  6684.       OPERATORS                 RELATIONAL                  OPERATORS
  6685.  
  6686.  
  6687.       Easy base uses the following relational operators:-
  6688.  
  6689.       =    (equals)
  6690.       <>   (not equals)
  6691.       >    (greater than)
  6692.       <    (less than)
  6693.       >=   (greater than or equal to)
  6694.       <=   (less than or equal to)
  6695.  
  6696.  
  6697.       Where relational operators and arithmetic operators are both
  6698.       used in a derivation. Relational operations are performed after
  6699.       arithmetic operations.
  6700.  
  6701.       Text values are not case sensitive when compared with
  6702.       relational operators.
  6703.  
  6704.       When you compare two fields or variables, the comparison is
  6705.       numeric if both are numeric and alphabetic if both are
  6706.       alphabetic.  If you compare a numeric field with a text field
  6707.       then Easy Base will test to see if the text field contains a
  6708.       number.  If it does then the comparison will be numeric and if
  6709.       it does not then the comparison will be alphabetic.
  6710.  
  6711.       WARNING
  6712.  
  6713.       If you compare the result of a division in an integer or fixed
  6714.       point field using the = or the <> operators, then the value
  6715.       used for comparison will be the (accurate) stored value and not
  6716.       the "Truncated" number shown in the field.
  6717.  
  6718.       See Operators Arithmetic
  6719.  
  6720.  
  6721.  
  6722.  
  6723.  
  6724.  
  6725.  
  6726.  
  6727.  
  6728.  
  6729.  
  6730.  
  6731.  
  6732.  
  6733.  
  6734.  
  6735.  
  6736.  
  6737.  
  6738.  
  6739.  
  6740.                                 - 107 -
  6741. ................................................................................
  6742.  
  6743.  
  6744.  
  6745.       OPERATORS                  LOGICAL                    OPERATORS
  6746.  
  6747.  
  6748.       Easy Base uses the following logical operators:-
  6749.  
  6750.       1.  and
  6751.       2.  or
  6752.       3.  xor     (or exclusive)
  6753.       4.  eqv     (equivalence)
  6754.       5.  imp     (implication)
  6755.  
  6756.       Logical operations are performed last after arithmetic and
  6757.       relational.
  6758.  
  6759.       Logical operators return a boolean (true or false) value from
  6760.       two other boolean expressions.
  6761.  
  6762.       Ex.
  6763.  
  6764.       If(x = y and a = b,"Yes","No")
  6765.          < Yes is returned if both expressions are true >
  6766.  
  6767.       If(x = y or a = b,"Yes","No")
  6768.          < Yes is returned if either or both expressions are true >
  6769.  
  6770.       If(x = y xor a = b,"Yes","No")
  6771.          < Yes is returned if either one but not both are true >
  6772.  
  6773.       If(x = y eqv a = b,"Yes","No")
  6774.          < Yes is returned if both expressions are true or if both
  6775.            expressions are false >
  6776.  
  6777.       If(x = y imp a = b,"Yes","No")
  6778.  
  6779.          < Yes is returned for all combinations except the first
  6780.            expression being true and the second false >
  6781.  
  6782.       The Easy Base logical operators are primarily designed for use
  6783.       within the "If" function and in "If..Then..Else" constructions
  6784.       where their actual value is not relevant. If you wish to use
  6785.       the value of "false" in formulae then it is represented by 0.
  6786.       True can be represented by any value other than 0 and should
  6787.       not be used.
  6788.  
  6789.  
  6790.  
  6791.  
  6792.  
  6793.  
  6794.  
  6795.  
  6796.  
  6797.  
  6798.  
  6799.  
  6800.  
  6801.                                 - 108 -
  6802. ................................................................................
  6803.  
  6804.  
  6805.  
  6806.       OPTIONS                    UTILITY                      OPTIONS
  6807.  
  6808.  
  6809.       The "Options" utility allows you to select your preferred date
  6810.       format (European or North American).
  6811.  
  6812.       You can also enable or disable screen saving. If enabled the
  6813.       screen saver operates after three minutes without a keypress
  6814.       during record entry, procedure screen entry or if a menu is
  6815.       being displayed. The screensaver is never invoked while a
  6816.       procedure is running or while reformatting or re-indexing is
  6817.       taking place.
  6818.  
  6819.       The third option allows you to select the border style you
  6820.       require around menus and message boxes.
  6821.  
  6822.       Option four selects whether or not screen clearing will be done
  6823.       with the curtain effect.
  6824.  
  6825.       Option five selects the COM port which will be used during
  6826.       Auto-dialling.
  6827.  
  6828.       The options utility can be called as a user menu function so
  6829.       that an end user can access the facilities without access to
  6830.       the system menus.
  6831.  
  6832.  
  6833.  
  6834.  
  6835.  
  6836.  
  6837.  
  6838.  
  6839.  
  6840.  
  6841.  
  6842.  
  6843.  
  6844.  
  6845.  
  6846.  
  6847.  
  6848.  
  6849.  
  6850.  
  6851.  
  6852.  
  6853.  
  6854.  
  6855.  
  6856.  
  6857.  
  6858.  
  6859.  
  6860.  
  6861.  
  6862.                                 - 109 -
  6863. ................................................................................
  6864.  
  6865.  
  6866.  
  6867.       OUTPUT                   SYSTEM VALUE                    OUTPUT
  6868.  
  6869.  
  6870.       When a user runs a procedure his choice of output, screen,
  6871.       printer or disk is stored in the system value "Output".
  6872.  
  6873.       By accessing the system value "Output" you can make your
  6874.       procedure do different things depending on where the output is
  6875.       to be sent.
  6876.  
  6877.       Ex.
  6878.  
  6879.       if output = "screen" then
  6880.          print heading1
  6881.       else
  6882.          print heading2
  6883.       end if
  6884.  
  6885.  
  6886.  
  6887.  
  6888.  
  6889.  
  6890.  
  6891.  
  6892.  
  6893.  
  6894.  
  6895.  
  6896.  
  6897.  
  6898.  
  6899.  
  6900.  
  6901.  
  6902.  
  6903.  
  6904.  
  6905.  
  6906.  
  6907.  
  6908.  
  6909.  
  6910.  
  6911.  
  6912.  
  6913.  
  6914.  
  6915.  
  6916.  
  6917.  
  6918.  
  6919.  
  6920.  
  6921.  
  6922.  
  6923.                                 - 110 -
  6924. ................................................................................
  6925.  
  6926.  
  6927.  
  6928.       PACK DATA FORMS            UTILITY              PACK DATA FORMS
  6929.  
  6930.  
  6931.       The process of actually removing a deleted record from a form
  6932.       is time consuming. What actually happens is that all the "Live"
  6933.       records are copied to a temporary file. The original file is
  6934.       then deleted and the temporary one re-named to the original
  6935.       name. Because of this it is actually quicker to remove fifty
  6936.       "Dead" records than it is to remove one. To save you time Easy
  6937.       base follows the traditional data-base custom of simply marking
  6938.       records for deletion when you delete them. They are only
  6939.       physically removed from the form during a "Pack" operation.
  6940.       When you "Pack" a data file Easy Base also re-writes all the
  6941.       index files for that form. You can pack individual forms with
  6942.       the "Pack Data Forms" utility accessed from the Utilities menu.
  6943.       You can also call the "Pack Data Forms" utility as a User menu
  6944.       function. In a finished application any necessary packing would
  6945.       normally be done from a batch execute menu which would run
  6946.       while the computer was unattended.
  6947.  
  6948.       Forms in which records are regularly deleted should be packed
  6949.       regularly. If packing is not done then not only will you be
  6950.       wasting disk space but search operations will become
  6951.       progressively slower as the percentage of "Dead" records
  6952.       increases.
  6953.  
  6954.       This is fairly obvious - however it is not so obvious that a
  6955.       forms index files can accumulate "Dead" records even though
  6956.       none have been deleted from the main file. An index file is
  6957.       simply the indexed fields contents and record number arranged
  6958.       in order. If, having filed a record you then alter the contents
  6959.       of an indexed field and update the record then the original
  6960.       record in the index file is deleted and a new one entered.
  6961.  
  6962.       Index files with "Dead records" also waste disk space and slow
  6963.       search operations. You should therefore regularly pack any
  6964.       forms which are regularly updated.
  6965.  
  6966.       If you are unsure which forms need to be packed you can use the
  6967.       "Auto-Pack" utility which tests each form and each forms index
  6968.       files for "Dead" records. The form is packed if it or any of
  6969.       its index files is found to have more then 100 total or 10 per
  6970.       cent "Dead" records.
  6971.  
  6972.       Although "Auto-Pack" may seem the easy answer, an application
  6973.       will almost certainly have several forms with "Core" data which
  6974.       remain unchanged and therefore never require packing. If you
  6975.       can identify the forms which do need to be packed and do them
  6976.       individually or from a batch execute menu this will be less
  6977.       time consuming than always using the "Auto-Pack" facility.
  6978.  
  6979.  
  6980.  
  6981.  
  6982.  
  6983.  
  6984.                                 - 111 -
  6985. ................................................................................
  6986.  
  6987.  
  6988.  
  6989.       PAGE NUMBER              SYSTEM VALUE               PAGE NUMBER
  6990.  
  6991.  
  6992.       Whenever Easy Base is processing a procedure with an output it
  6993.       keeps track of the current page number (Even if you have not
  6994.       included Page Feed commands). You can use the system value
  6995.       "Page Number" to number the pages of your output. To use the
  6996.       "Page Number" value just include "Page Number" in your output
  6997.       field declarations.
  6998.  
  6999.       Declare output fields
  7000.          Customers.name : Customers.ACNO : Page Number
  7001.       end
  7002.  
  7003.       You can then use the "Page Number" field in the Page Header or
  7004.       Page Footer section of your output format.
  7005.  
  7006.  
  7007.  
  7008.  
  7009.  
  7010.  
  7011.  
  7012.  
  7013.  
  7014.  
  7015.  
  7016.  
  7017.  
  7018.  
  7019.  
  7020.  
  7021.  
  7022.  
  7023.  
  7024.  
  7025.  
  7026.  
  7027.  
  7028.  
  7029.  
  7030.  
  7031.  
  7032.  
  7033.  
  7034.  
  7035.  
  7036.  
  7037.  
  7038.  
  7039.  
  7040.  
  7041.  
  7042.  
  7043.  
  7044.  
  7045.                                 - 112 -
  7046. ................................................................................
  7047.  
  7048.  
  7049.  
  7050.       PAUSE ON/OFF           PROCEDURE COMMAND           PAUSE ON/OFF
  7051.  
  7052.  
  7053.       When an Easy Base procedure has an output to the screen, the
  7054.       output, by default scrolls continuously until the procedure is
  7055.       complete. You can allow the user to pause the output with the
  7056.       "Pause On" command.
  7057.  
  7058.       If a procedure performs several tasks then the pause facility
  7059.       can be selectively enabled and disabled at any point.
  7060.  
  7061.       Ex.
  7062.  
  7063.       for employees alias types with type in order unique
  7064.          pause off:escape off
  7065.          for employees alias group with type = types.type
  7066.             subindex surname
  7067.          next
  7068.          pause on
  7069.          for employees with subindex in order
  7070.             print list items
  7071.          next
  7072.       next
  7073.  
  7074.       The above code fragment prints employees details in type groups
  7075.       with surname in alphabetic order. During the procedure the user
  7076.       can pause the report while it is listing the output but not
  7077.       while it is subindexing the group.
  7078.  
  7079.  
  7080.  
  7081.  
  7082.  
  7083.  
  7084.  
  7085.  
  7086.  
  7087.  
  7088.  
  7089.  
  7090.  
  7091.  
  7092.  
  7093.  
  7094.  
  7095.  
  7096.  
  7097.  
  7098.  
  7099.  
  7100.  
  7101.  
  7102.  
  7103.  
  7104.  
  7105.  
  7106.                                 - 113 -
  7107. ................................................................................
  7108.  
  7109.  
  7110.  
  7111.       PI                       SYSTEM VALUE                        PI
  7112.  
  7113.  
  7114.       You can use the value of π anywhere in field derivations or
  7115.       procedure code by quoting "Pi".
  7116.  
  7117.       Ex     circlearea = Pi / 4 diam^2
  7118.  
  7119.  
  7120.  
  7121.  
  7122.  
  7123.  
  7124.  
  7125.  
  7126.  
  7127.  
  7128.  
  7129.  
  7130.  
  7131.  
  7132.  
  7133.  
  7134.  
  7135.  
  7136.  
  7137.  
  7138.  
  7139.  
  7140.  
  7141.  
  7142.  
  7143.  
  7144.  
  7145.  
  7146.  
  7147.  
  7148.  
  7149.  
  7150.  
  7151.  
  7152.  
  7153.  
  7154.  
  7155.  
  7156.  
  7157.  
  7158.  
  7159.  
  7160.  
  7161.  
  7162.  
  7163.  
  7164.  
  7165.  
  7166.  
  7167.                                 - 114 -
  7168. ................................................................................
  7169.  
  7170.  
  7171.  
  7172.       PRESELECT              PROCEDURE COMMAND              PRESELECT
  7173.  
  7174.  
  7175.       The "Preselect" command sets highlighting of the next user menu
  7176.       when the procedure terminates.  If a procedure is normally
  7177.       followed by a particular selection from the menu then you can
  7178.       save the user the trouble of choosing it by issuing the
  7179.       "Preselect" command within the procedure.
  7180.  
  7181.       for currentcustomer
  7182.          currentcustomer.acno = input.acno
  7183.          update record
  7184.       next
  7185.       preselect 4
  7186.  
  7187.       The parameter cannot be supplied as a variable.
  7188.  
  7189.  
  7190.  
  7191.  
  7192.  
  7193.  
  7194.  
  7195.  
  7196.  
  7197.  
  7198.  
  7199.  
  7200.  
  7201.  
  7202.  
  7203.  
  7204.  
  7205.  
  7206.  
  7207.  
  7208.  
  7209.  
  7210.  
  7211.  
  7212.  
  7213.  
  7214.  
  7215.  
  7216.  
  7217.  
  7218.  
  7219.  
  7220.  
  7221.  
  7222.  
  7223.  
  7224.  
  7225.  
  7226.  
  7227.  
  7228.                                 - 115 -
  7229. ................................................................................
  7230.  
  7231.  
  7232.  
  7233.       PRINT                  PROCEDURE COMMAND                  PRINT
  7234.  
  7235.  
  7236.       In Easy Base procedures, all output to the screen or printer is
  7237.       initiated with the "Print" command. The "Print" command prints
  7238.       sections from the procedures output format.
  7239.  
  7240.       Ex.
  7241.  
  7242.       '......................procedure code....
  7243.       Print report header
  7244.       for customers
  7245.          print list items
  7246.       next
  7247.       print report footer
  7248.       '......................Output Format.......
  7249.       .Report Header
  7250.             ════════════════════════════════════════════════
  7251.                           Customer List
  7252.             ════════════════════════════════════════════════
  7253.       .List Items
  7254.             {customers.name field}  {customers.phone field}
  7255.       .Report Footer
  7256.             ════════════════════════════════════════════════
  7257.       .end
  7258.  
  7259.       The format sections are marked with a full stop in the margin
  7260.       followed by the section name. When you type a full stop in the
  7261.       margin of the "Format editor" Easy Base will offer you a
  7262.       selection of section names. You do not have to use these - they
  7263.       are just some common names that can save you time. To enter
  7264.       your own section names just press escape and type in any name
  7265.       you wish.
  7266.  
  7267.       The ".end" section is not strictly necessary but it is easy to
  7268.       accidentally insert blank lines at the end of your format. By
  7269.       inserting ".end" at the end of the last section you will
  7270.       prevent these from being printed.
  7271.  
  7272.  
  7273.  
  7274.  
  7275.  
  7276.  
  7277.  
  7278.  
  7279.  
  7280.  
  7281.  
  7282.  
  7283.  
  7284.  
  7285.  
  7286.  
  7287.  
  7288.  
  7289.                                 - 116 -
  7290. ................................................................................
  7291.  
  7292.  
  7293.  
  7294.       PRINTER CONTROL        PROCEDURE COMMAND        PRINTER CONTROL
  7295.  
  7296.  
  7297.       When you send a procedure output to the printer Easy Base will
  7298.       initialize your printer at ten characters per inch, six lines
  7299.       per inch in draft mode.
  7300.  
  7301.       You can alter the printer mode anywhere within a procedure with
  7302.       the following printer controls.
  7303.  
  7304.       Bold On            Bold Off
  7305.       Underline On       Underline Off  (Underlines field contents)
  7306.       Italic On          Italic Off
  7307.       NLQ On             NLQ Off
  7308.  
  7309.       8 lpi      Sets printing to eight lines per inch
  7310.       6 lpi      Sets printing to six lines per inch
  7311.       10 cpi     Sets printing to ten characters per inch
  7312.       12 cpi     Sets printing to twelve characters per inch
  7313.       17 cpi     sets printing to either 15 or 17 depending on
  7314.                  printer
  7315.       Line Feed  Advances the print head one line
  7316.       Page Feed  Ejects the current page.
  7317.  
  7318.       Ex.
  7319.       NLQ On
  7320.       Bold on
  7321.       Print report header
  7322.       Bold Off
  7323.       12 CPI
  7324.       For customers
  7325.          print list items
  7326.          if bottom margin < 1.5 then
  7327.             Line feed : Bold On : 10 CPI
  7328.             Print Page footer
  7329.             Page feed
  7330.             Print Page header
  7331.             Bold Off : 12 CPI
  7332.          end if
  7333.       next
  7334.       Bold on:Italic On :10 CPI
  7335.       print report footer
  7336.  
  7337.       The above example turns Near Letter Quality printing on for the
  7338.       entire report. It prints page headers and footers in bold at 10
  7339.       characters per inch, list items at 12 characters per inch and
  7340.       the report footer in bold italics.
  7341.  
  7342.  
  7343.  
  7344.  
  7345.  
  7346.  
  7347.  
  7348.  
  7349.  
  7350.                                 - 117 -
  7351. ................................................................................
  7352.  
  7353.  
  7354.  
  7355.       Prog_Dir                 System Value                  Prog_Dir
  7356.  
  7357.  
  7358.       Whenever you run a procedure in Easy Base the drive and
  7359.       directory of the program files is available in the system value
  7360.       Prog_Dir.
  7361.  
  7362.       If you write applications for resale on the Easy Base Runtime
  7363.       module then you will not necessarily know the name of the
  7364.       directory to which the end user has installed your application.
  7365.       If your application opens external files you can ensure that
  7366.       they are in the Application directory by using Prog_Dir.
  7367.  
  7368.  
  7369.       declare variables
  7370.          pathfile as text
  7371.       end
  7372.       pathfile = jointext(Prog_Dir,"\NAMES.TXT")
  7373.       open pathfile
  7374.  
  7375.  
  7376.  
  7377.  
  7378.  
  7379.  
  7380.  
  7381.  
  7382.  
  7383.  
  7384.  
  7385.  
  7386.  
  7387.  
  7388.  
  7389.  
  7390.  
  7391.  
  7392.  
  7393.  
  7394.  
  7395.  
  7396.  
  7397.  
  7398.  
  7399.  
  7400.  
  7401.  
  7402.  
  7403.  
  7404.  
  7405.  
  7406.  
  7407.  
  7408.  
  7409.  
  7410.  
  7411.                                 - 118 -
  7412. ................................................................................
  7413.  
  7414.  
  7415.  
  7416.       PROPER                     FUNCTION                      PROPER
  7417.  
  7418.  
  7419.       This function returns the parameter with the first letter of
  7420.       each word in upper case and the rest in lower case. If you wish
  7421.       to enter initials in a field derived as proper and keep them in
  7422.       upper case then there must either be a space or a full stop
  7423.       between them.
  7424.  
  7425.       Ex.     Proper(Address)
  7426.  
  7427.       Ex.
  7428.  
  7429.       labelname = upper(company.name)
  7430.       insetname = proper(company.name)
  7431.  
  7432.  
  7433.       Acceptable parameters:
  7434.  
  7435.       Quoted text
  7436.       Text field/variable
  7437.  
  7438.  
  7439.  
  7440.  
  7441.  
  7442.  
  7443.  
  7444.  
  7445.  
  7446.  
  7447.  
  7448.  
  7449.  
  7450.  
  7451.  
  7452.  
  7453.  
  7454.  
  7455.  
  7456.  
  7457.  
  7458.  
  7459.  
  7460.  
  7461.  
  7462.  
  7463.  
  7464.  
  7465.  
  7466.  
  7467.  
  7468.  
  7469.  
  7470.  
  7471.  
  7472.                                 - 119 -
  7473. ................................................................................
  7474.  
  7475.  
  7476.  
  7477.       Q AND A INPUT SCREEN        METHOD         Q AND A INPUT SCREEN
  7478.  
  7479.  
  7480.       If, for a procedure you have to collect many items of data via
  7481.       an input screen, then presenting all the fields and their
  7482.       labels at once can be confusing to an operator.  You can start
  7483.       with an empty screen other than the first field and its prompt
  7484.       then have each subsequent prompt "Pop up" when the previous
  7485.       field has been filled.
  7486.  
  7487.       To do this you make all your input fields without a background
  7488.       (Text, Alt1 or Alt2) and you create fields for the prompts
  7489.       which have no user entry and also show no background.
  7490.  
  7491.       Ex.
  7492.  
  7493.       To collect data for paymethod, customer, and amount lay out the
  7494.       following fields:-
  7495.  
  7496.               Enter Method of payment....     { Paymethod Field }
  7497.               { Pop1 Field               }    { Customer Field  }
  7498.               { Pop2 Field               }    { Amount Field   }
  7499.  
  7500.       The "Pop1" field is derived:-
  7501.  
  7502.          If(Pop1 = blank and paymethod = blank,blank,"Enter Customers
  7503.                  name.........")
  7504.  
  7505.       and the "Pop2" field is derived:-
  7506.  
  7507.          If(Pop2 = blank and customer = blank,blank,"Enter Amount...
  7508.                 ...............")
  7509.  
  7510.  
  7511.  
  7512.  
  7513.  
  7514.  
  7515.  
  7516.  
  7517.  
  7518.  
  7519.  
  7520.  
  7521.  
  7522.  
  7523.  
  7524.  
  7525.  
  7526.  
  7527.  
  7528.  
  7529.  
  7530.  
  7531.  
  7532.  
  7533.                                 - 120 -
  7534. ................................................................................
  7535.  
  7536.  
  7537.  
  7538.       RANDOM                     FUNCTION                      RANDOM
  7539.  
  7540.  
  7541.       This function returns a random number between the upper and
  7542.       lower parameters.
  7543.  
  7544.       Ex.  Random(1,100)
  7545.          <Returns a random number between 1 and 100>
  7546.  
  7547.       Ex.  The two fields No and card simulate the random cutting of
  7548.       a deck of cards each time the No field is cleared.
  7549.  
  7550.       No field derivation:-
  7551.           if(no <> blank,no,random(1,52))
  7552.  
  7553.       Card field derivation:-
  7554.  
  7555.           jointext(if(mod(no,13) = 1,"Ace",mod(no,13) = 0,"King",
  7556.       mod(no,13) = 12,"Queen",mod(no,13) = 11,"Jack",mod(no,13)),
  7557.       " of ",if(no < 14,"Hearts",no < 27 ,"Clubs",no <40,"Diamonds",
  7558.       ,"Spades"))
  7559.  
  7560.  
  7561.       Acceptable parameters
  7562.  
  7563.       Numeric Value
  7564.       Numeric expression
  7565.       Numeric field/variable
  7566.       Any other function which returns a numeric value
  7567.  
  7568.  
  7569.  
  7570.  
  7571.  
  7572.  
  7573.  
  7574.  
  7575.  
  7576.  
  7577.  
  7578.  
  7579.  
  7580.  
  7581.  
  7582.  
  7583.  
  7584.  
  7585.  
  7586.  
  7587.  
  7588.  
  7589.  
  7590.  
  7591.  
  7592.  
  7593.  
  7594.                                 - 121 -
  7595. ................................................................................
  7596.  
  7597.  
  7598.  
  7599.       Read                     File Command                      Read
  7600.  
  7601.  
  7602.       The "Read" command reads data from a non Easy Base file which
  7603.       has been opened with the "Open" command.
  7604.  
  7605.       The syntax is:
  7606.       Read (Length) to (Field or variable)
  7607.  
  7608.       Length can be absolute, a variable or field or the keyword
  7609.       "Line".
  7610.  
  7611.       Ex.
  7612.  
  7613.       Read 45 to Keyvar
  7614.       Read GetLen to customers.name
  7615.       Read Line to Linestring
  7616.  
  7617.       In the "Line" example Easy Base reads from the current File_pos
  7618.       to the end of the current ASCII line.
  7619.  
  7620.       See also: Open, Close, Seek, Write, Find, Erase
  7621.  
  7622.  
  7623.  
  7624.  
  7625.  
  7626.  
  7627.  
  7628.  
  7629.  
  7630.  
  7631.  
  7632.  
  7633.  
  7634.  
  7635.  
  7636.  
  7637.  
  7638.  
  7639.  
  7640.  
  7641.  
  7642.  
  7643.  
  7644.  
  7645.  
  7646.  
  7647.  
  7648.  
  7649.  
  7650.  
  7651.  
  7652.  
  7653.  
  7654.  
  7655.                                 - 122 -
  7656. ................................................................................
  7657.  
  7658.  
  7659.  
  7660.       REBUILD DIRECTORIES        UTILITY          REBUILD DIRECTORIES
  7661.  
  7662.  
  7663.       In Easy Base, all DOS file handling is taken care of for you in
  7664.       the background. To do this Easy Base maintains three
  7665.       "Directory" files in which the names which you give to forms,
  7666.       procedures and choice field lists are linked to the actual DOS
  7667.       filenames.
  7668.  
  7669.       The three files are :-
  7670.  
  7671.       BASE.DIR     The forms directory
  7672.       PROC.DIR     The procedures directory
  7673.       CHOICES.DIR  The choice list directory
  7674.  
  7675.       Because these are key files, Easy Base includes a utility which
  7676.       will rebuild them in the event of accidental erasure or
  7677.       corruption.
  7678.  
  7679.  
  7680.  
  7681.  
  7682.  
  7683.  
  7684.  
  7685.  
  7686.  
  7687.  
  7688.  
  7689.  
  7690.  
  7691.  
  7692.  
  7693.  
  7694.  
  7695.  
  7696.  
  7697.  
  7698.  
  7699.  
  7700.  
  7701.  
  7702.  
  7703.  
  7704.  
  7705.  
  7706.  
  7707.  
  7708.  
  7709.  
  7710.  
  7711.  
  7712.  
  7713.  
  7714.  
  7715.  
  7716.                                 - 123 -
  7717. ................................................................................
  7718.  
  7719.  
  7720.  
  7721.       RECORD NUMBER            SYSTEM VALUE             RECORD NUMBER
  7722.  
  7723.  
  7724.       If you derive a field with the formula "record number" it will
  7725.       be filled with the record number at the time of filing or
  7726.       reformatting.  Record number differs from "sequence" in the
  7727.       following way. Each time you derive a field with "sequence" you
  7728.       get the next sequencial number irrespective of whether the form
  7729.       has had records deleted and has been repacked. If a file has
  7730.       had at some time 500 records but now only has 20 the next
  7731.       derivation of "sequence" will be 501 and the next derivation of
  7732.       "record number" will be 21.
  7733.  
  7734.       The main use of "record number" is to renumber a set of records
  7735.       after deletions. To do this just add a new field to the form
  7736.       derived as record number. The field will be filled
  7737.       automatically during the data reformatting process.
  7738.  
  7739.       Record Number has no meaning in procedure code.
  7740.  
  7741.       See Also:-  Current Record Number
  7742.  
  7743.  
  7744.  
  7745.  
  7746.  
  7747.  
  7748.  
  7749.  
  7750.  
  7751.  
  7752.  
  7753.  
  7754.  
  7755.  
  7756.  
  7757.  
  7758.  
  7759.  
  7760.  
  7761.  
  7762.  
  7763.  
  7764.  
  7765.  
  7766.  
  7767.  
  7768.  
  7769.  
  7770.  
  7771.  
  7772.  
  7773.  
  7774.  
  7775.  
  7776.  
  7777.                                 - 124 -
  7778. ................................................................................
  7779.  
  7780.  
  7781.  
  7782.       REMARK                 PROCEDURE COMMAND                 REMARK
  7783.  
  7784.  
  7785.       You can place remarks anywhere within Easy base procedure code
  7786.       by prefixing them with an apostrophe.
  7787.  
  7788.       Ex.
  7789.  
  7790.       '.................This entire line is a remark.....
  7791.       for pupils with age > 9
  7792.          if grade = "g" then skip record   'exclude g's from count
  7793.          count = count + 1                 'These are remarks
  7794.       next
  7795.       '..............................................
  7796.  
  7797.       All text to the right of the apostrophe is ignored at run time.
  7798.  
  7799.  
  7800.  
  7801.  
  7802.  
  7803.  
  7804.  
  7805.  
  7806.  
  7807.  
  7808.  
  7809.  
  7810.  
  7811.  
  7812.  
  7813.  
  7814.  
  7815.  
  7816.  
  7817.  
  7818.  
  7819.  
  7820.  
  7821.  
  7822.  
  7823.  
  7824.  
  7825.  
  7826.  
  7827.  
  7828.  
  7829.  
  7830.  
  7831.  
  7832.  
  7833.  
  7834.  
  7835.  
  7836.  
  7837.  
  7838.                                 - 125 -
  7839. ................................................................................
  7840.  
  7841.  
  7842.  
  7843.       RESTORE                    UTILITY                      RESTORE
  7844.  
  7845.  
  7846.       Easy Base will restore applications or data which it has backed
  7847.       up. You can only restore an application with the "Restore
  7848.       Application" utility called from the utilities menu and you can
  7849.       only restore data-only backups with the "Restore Data" utility
  7850.       called from a user menu.
  7851.  
  7852.  
  7853.       See Also:-  Backup
  7854.  
  7855.  
  7856.  
  7857.  
  7858.  
  7859.  
  7860.  
  7861.  
  7862.  
  7863.  
  7864.  
  7865.  
  7866.  
  7867.  
  7868.  
  7869.  
  7870.  
  7871.  
  7872.  
  7873.  
  7874.  
  7875.  
  7876.  
  7877.  
  7878.  
  7879.  
  7880.  
  7881.  
  7882.  
  7883.  
  7884.  
  7885.  
  7886.  
  7887.  
  7888.  
  7889.  
  7890.  
  7891.  
  7892.  
  7893.  
  7894.  
  7895.  
  7896.  
  7897.  
  7898.  
  7899.                                 - 126 -
  7900. ................................................................................
  7901.  
  7902.  
  7903.  
  7904.       RETAIL                     FUNCTION                      RETAIL
  7905.  
  7906.  
  7907.       The retail function returns the retail price given the
  7908.       wholesale price and the discount as a percentage of retail.
  7909.  
  7910.       Ex   Retail(cost,discount)
  7911.  
  7912.            < returns 125 if cost = 100 and discount = 20>
  7913.  
  7914.  
  7915.  
  7916.  
  7917.  
  7918.  
  7919.  
  7920.  
  7921.  
  7922.  
  7923.  
  7924.  
  7925.  
  7926.  
  7927.  
  7928.  
  7929.  
  7930.  
  7931.  
  7932.  
  7933.  
  7934.  
  7935.  
  7936.  
  7937.  
  7938.  
  7939.  
  7940.  
  7941.  
  7942.  
  7943.  
  7944.  
  7945.  
  7946.  
  7947.  
  7948.  
  7949.  
  7950.  
  7951.  
  7952.  
  7953.  
  7954.  
  7955.  
  7956.  
  7957.  
  7958.  
  7959.  
  7960.                                 - 127 -
  7961. ................................................................................
  7962.  
  7963.  
  7964.  
  7965.       RETEST                 DERIVATION PREFIX                 RETEST
  7966.  
  7967.  
  7968.       In Easy Base, fields are derived when a new record is started
  7969.       and when any other field which affects the derivation is
  7970.       changed. You can force a field to be rederived when F2 is
  7971.       pressed by prefixing the derivation with "retest".
  7972.  
  7973.       Suppose you have a field "degrees" in which the user must enter
  7974.       a number between 1 and 360.
  7975.  
  7976.       To prevent him entering an out of range number you could derive
  7977.       the field :-
  7978.  
  7979.       If(degrees<1 or degrees > 360,blank[beepInvalid number of
  7980.       degreesCursor degrees],degrees)
  7981.  
  7982.       The above derivation would prevent the user from filing a
  7983.       record with an out of range number. However, by the time he
  7984.       read the message, his entry would be blanked out. It would be
  7985.       better if the number he had typed could be left in the field so
  7986.       that he could see his error. To do this all you have to do is
  7987.       change "blank" to "degrees" in the above derivation.
  7988.  
  7989.       This however would allow the user ( Should he decide to ignore
  7990.       the message ) to then file the incorrect value. To leave the
  7991.       value in the field and still prevent the user from filing it,
  7992.       use the "retest" prefix.
  7993.  
  7994.       Retest If(degrees<1 or degrees > 360,degrees[beepInvalid number
  7995.       of degreesCursor degrees],degrees)
  7996.  
  7997.  
  7998.       Note:-
  7999.  
  8000.       1.  You can only have one prefix on any one field derivation.
  8001.  
  8002.  
  8003.  
  8004.  
  8005.  
  8006.  
  8007.  
  8008.  
  8009.  
  8010.  
  8011.  
  8012.  
  8013.  
  8014.  
  8015.  
  8016.  
  8017.  
  8018.  
  8019.  
  8020.  
  8021.                                 - 128 -
  8022. ................................................................................
  8023.  
  8024.  
  8025.  
  8026.       REVERSE                    FUNCTION                     REVERSE
  8027.  
  8028.  
  8029.       The reverse function is used in the creation of compound index
  8030.       fields. What it actually does is alter the characters of the
  8031.       parameter in such a way that an alphabetic listing of a field
  8032.       after reversal will have the reverse order to that of the
  8033.       original characters before using the reverse function.
  8034.  
  8035.       In the example shown for the function "zeropad", had you wished
  8036.       to list the pupils in descending age order there would be no
  8037.       point in using the procedure code:
  8038.  
  8039.       for pupils with unifield in reverse order
  8040.  
  8041.       as this would not only reverse the age grouping but would also
  8042.       reverse the name order.
  8043.  
  8044.       To produce the desired printout use exactly the same procedure
  8045.       but derive "unifield" as:-
  8046.  
  8047.       Jointext(reverse(zeropad(age,2,0)),name)
  8048.  
  8049.  
  8050.  
  8051.  
  8052.  
  8053.  
  8054.  
  8055.  
  8056.  
  8057.  
  8058.  
  8059.  
  8060.  
  8061.  
  8062.  
  8063.  
  8064.  
  8065.  
  8066.  
  8067.  
  8068.  
  8069.  
  8070.  
  8071.  
  8072.  
  8073.  
  8074.  
  8075.  
  8076.  
  8077.  
  8078.  
  8079.  
  8080.  
  8081.  
  8082.                                 - 129 -
  8083. ................................................................................
  8084.  
  8085.  
  8086.  
  8087.       RIGHTTEXT                  FUNCTION                   RIGHTTEXT
  8088.  
  8089.  
  8090.       This function returns a specified number of characters from the
  8091.       end of a field or variable.
  8092.  
  8093.       Ex    Righttext(name,10)
  8094.  
  8095.  
  8096.       Ex.   Righttext(datetext(system date),4)
  8097.             < returns  1993 , 1994 Etc.>
  8098.  
  8099.  
  8100.       Acceptable parameters:
  8101.  
  8102.       Text field/variable
  8103.       Any function returning a text value
  8104.  
  8105.  
  8106.  
  8107.  
  8108.  
  8109.  
  8110.  
  8111.  
  8112.  
  8113.  
  8114.  
  8115.  
  8116.  
  8117.  
  8118.  
  8119.  
  8120.  
  8121.  
  8122.  
  8123.  
  8124.  
  8125.  
  8126.  
  8127.  
  8128.  
  8129.  
  8130.  
  8131.  
  8132.  
  8133.  
  8134.  
  8135.  
  8136.  
  8137.  
  8138.  
  8139.  
  8140.  
  8141.  
  8142.  
  8143.                                 - 130 -
  8144. ................................................................................
  8145.  
  8146.  
  8147.  
  8148.       ROUND                      FUNCTION                       ROUND
  8149.  
  8150.  
  8151.       There are three rounding functions in Easy base:-
  8152.  
  8153.       Round
  8154.       Roundup
  8155.       Rounddown
  8156.  
  8157.       If a rounding function is called with a single parameter then
  8158.       the return value is the parameter rounded to the nearest
  8159.       integer value.
  8160.  
  8161.       Ex. Round(items/reps)
  8162.          < if items = 9 and reps = 4. 2 is returned >
  8163.  
  8164.       All rounding functions accept a second parameter indicating the
  8165.       number of decimal places (or powers of 10 if negative) to round
  8166.       to.
  8167.  
  8168.       Ex. Rounddown(vaton(net),2)
  8169.          < Rounds down the VAT on field "net" to the nearest penny.
  8170.  
  8171.       Ex. Jointext(roundup(if(mod(years,100) = 0,years+1,years),-2
  8172.           )/100,"th Century")
  8173.  
  8174.         < Returns "20th Century" for all values of years 1900-1999 >
  8175.  
  8176.  
  8177.       Round Produces a default rounding system in which:-
  8178.  
  8179.          2.4 rounds to  2
  8180.          2.5 rounds to  3
  8181.         -2.4 rounds to -2
  8182.         -2.5 rounds to -3
  8183.  
  8184.       In the Roundup and Rounddown functions the direction is sign
  8185.       sensitive:-
  8186.  
  8187.          2.5 roundsup to  3      2.5 roundsdown to  2
  8188.         -2.5 roundsup to -2     -2.5 roundsdown to -3
  8189.  
  8190.       Acceptable parameters:
  8191.  
  8192.       Numeric value
  8193.       Numeric expression
  8194.       Numeric field/variable
  8195.       Any other function which returns a numeric value
  8196.  
  8197.  
  8198.  
  8199.  
  8200.  
  8201.  
  8202.  
  8203.  
  8204.                                 - 131 -
  8205. ................................................................................
  8206.  
  8207.  
  8208.  
  8209.       RUN                      FIELD CONTROL                      RUN
  8210.  
  8211.  
  8212.       The "run" control is used to initiate procedures with input
  8213.       screens without the user having to press F2.
  8214.  
  8215.       Ex.   If(lookup(customers,name) = blank,blank,lookup(customers,
  8216.             name)[run])
  8217.  
  8218.       In the above example, a procedure which lists customers
  8219.       accounts has an input screen with a single field where the
  8220.       customers name is entered. When the user enters a name the
  8221.       above derivation will test whether or not the entered name is a
  8222.       customer. If the entered name does not exist in the customers
  8223.       file the field will be blanked out but if it does then the
  8224.       procedure will run without the user having to press F2.
  8225.  
  8226.  
  8227.  
  8228.  
  8229.  
  8230.  
  8231.  
  8232.  
  8233.  
  8234.  
  8235.  
  8236.  
  8237.  
  8238.  
  8239.  
  8240.  
  8241.  
  8242.  
  8243.  
  8244.  
  8245.  
  8246.  
  8247.  
  8248.  
  8249.  
  8250.  
  8251.  
  8252.  
  8253.  
  8254.  
  8255.  
  8256.  
  8257.  
  8258.  
  8259.  
  8260.  
  8261.  
  8262.  
  8263.  
  8264.  
  8265.                                 - 132 -
  8266. ................................................................................
  8267.  
  8268.  
  8269.  
  8270.       RUNTIME AUTO START          METHOD           RUNTIME AUTO START
  8271.  
  8272.  
  8273.       If you intend to distribute an application using the Easy Base
  8274.       Runtime Module, you can have the module start automatically on
  8275.       a particular user menu by giving that menu the sign on password
  8276.       "Autostart".
  8277.  
  8278.       Each time the runtime module starts it searches for a menu with
  8279.       this password. If it finds one, it skips the sign on screen and
  8280.       starts automatically on this menu.
  8281.  
  8282.       The "Autostart" password has no significance while developing
  8283.       in Easy Base. It is treated as any other sign on password.
  8284.  
  8285.  
  8286.  
  8287.  
  8288.  
  8289.  
  8290.  
  8291.  
  8292.  
  8293.  
  8294.  
  8295.  
  8296.  
  8297.  
  8298.  
  8299.  
  8300.  
  8301.  
  8302.  
  8303.  
  8304.  
  8305.  
  8306.  
  8307.  
  8308.  
  8309.  
  8310.  
  8311.  
  8312.  
  8313.  
  8314.  
  8315.  
  8316.  
  8317.  
  8318.  
  8319.  
  8320.  
  8321.  
  8322.  
  8323.  
  8324.  
  8325.  
  8326.                                 - 133 -
  8327. ................................................................................
  8328.  
  8329.  
  8330.  
  8331.       SCREEN COLOURS             UTILITY               SCREEN COLOURS
  8332.  
  8333.  
  8334.       The "Screen Colours" utility provides 14 pre defined colour
  8335.       sets including two for "Mono Graphics" cards together with a
  8336.       user defined setup. To change the colours of your system simply
  8337.       select "Screen Colours" from the Utilities menu and select the
  8338.       set you want.
  8339.  
  8340.       The "Screen Colours" utility can also be called as a User Menu
  8341.       function allowing an end user to change his screen set from
  8342.       your menus without accessing the system.
  8343.  
  8344.  
  8345.  
  8346.  
  8347.  
  8348.  
  8349.  
  8350.  
  8351.  
  8352.  
  8353.  
  8354.  
  8355.  
  8356.  
  8357.  
  8358.  
  8359.  
  8360.  
  8361.  
  8362.  
  8363.  
  8364.  
  8365.  
  8366.  
  8367.  
  8368.  
  8369.  
  8370.  
  8371.  
  8372.  
  8373.  
  8374.  
  8375.  
  8376.  
  8377.  
  8378.  
  8379.  
  8380.  
  8381.  
  8382.  
  8383.  
  8384.  
  8385.  
  8386.  
  8387.                                 - 134 -
  8388. ................................................................................
  8389.  
  8390.  
  8391.  
  8392.       SECONDS                    FUNCTION                     SECONDS
  8393.  
  8394.  
  8395.       This function returns the seconds number from the time
  8396.       parameter.
  8397.  
  8398.       Ex.    seconds(system time)
  8399.  
  8400.  
  8401.       Acceptable parameters:
  8402.  
  8403.       System time
  8404.       Time field
  8405.       Maketime function
  8406.       Time expression
  8407.  
  8408.  
  8409.  
  8410.  
  8411.  
  8412.  
  8413.  
  8414.  
  8415.  
  8416.  
  8417.  
  8418.  
  8419.  
  8420.  
  8421.  
  8422.  
  8423.  
  8424.  
  8425.  
  8426.  
  8427.  
  8428.  
  8429.  
  8430.  
  8431.  
  8432.  
  8433.  
  8434.  
  8435.  
  8436.  
  8437.  
  8438.  
  8439.  
  8440.  
  8441.  
  8442.  
  8443.  
  8444.  
  8445.  
  8446.  
  8447.  
  8448.                                 - 135 -
  8449. ................................................................................
  8450.  
  8451.  
  8452.  
  8453.       Seek                     File Command                      Seek
  8454.  
  8455.  
  8456.       The "Seek" command moves the Read/Write pointer within a non
  8457.       Easy Base file which has been opened with the "Open" Command.
  8458.       The actual position of the pointer at any time is available in
  8459.       the system value File_Pos. The File_Pos value is the pointers
  8460.       current offset in bytes (Numbering the first byte as 1).
  8461.  
  8462.       The Seek Command accepts an actual offset, an offset relative
  8463.       to File_Pos or File_Len or an ASCII line movement.
  8464.  
  8465.       Examples.
  8466.  
  8467.       Seek 245
  8468.       Seek File_Pos + 35
  8469.       Seek File_Len - 20
  8470.       Seek Line_Forward
  8471.       Seek Line_Back
  8472.  
  8473.       You cannot combine an ASCII line movement with an offset -
  8474.       To read ten bytes starting at byte 30 on the next line you need
  8475.       two Seek commands.
  8476.  
  8477.       Seek Line_Forward
  8478.       Seek File_Pos + 29
  8479.       read 10 to Parts.No
  8480.  
  8481.       The line movement Line_Forward always positions the pointer at
  8482.       the start of the next line.
  8483.  
  8484.       The line movement Line_Back moves the pointer to the start of
  8485.       the current line if it is not already there and to the start of
  8486.       the previous line if it is.
  8487.  
  8488.       Some files (Eg. Email) have a non ASCII header followed by
  8489.       ASCII lines for the actual message. You can use Seek
  8490.       Line_Forward within a Do Loop to skip though the non ASCII
  8491.       part. If Line_Forward does not find a Carriage Return and Line
  8492.       Feed sequence within 255 bytes then it leaves the file pointer
  8493.       255 bytes ahead of its last position. There is no corresponding
  8494.       facility in Line_Back. If Line_Back does not find a line feed
  8495.       (or Start of File) within 255 bytes then the file pointer does
  8496.       not move.
  8497.  
  8498.       See also: Open, Close, Read, Write, Find, Erase
  8499.  
  8500.  
  8501.  
  8502.  
  8503.  
  8504.  
  8505.  
  8506.  
  8507.  
  8508.  
  8509.                                 - 136 -
  8510. ................................................................................
  8511.  
  8512.  
  8513.  
  8514.       SEQUENCE                 SYSTEM VALUE                  SEQUENCE
  8515.  
  8516.  
  8517.       When you create a new form a sequence value is updated each
  8518.       time a record is entered. The "sequence" value starts at 1 and
  8519.       continues to 2 billion irrespective of whether or not records
  8520.       have been deleted from the form. If you derive a field as
  8521.       "sequence" then each new record will have the next sequenced
  8522.       number. Sequence derivations are useful for such things as
  8523.       invoice numbers.
  8524.  
  8525.       A sequence field need not start at one however.
  8526.  
  8527.       Ex.  sequence + 1000 would number the first record 1001
  8528.  
  8529.       The sequence value is only available in data entry to a form.
  8530.       A common problem in data systems is to produce a sequence
  8531.       number when records are entered to forms via procedures.
  8532.  
  8533.       To accomplish this define fields to hold the number on both the
  8534.       form and the procedure input screen. Also define a single
  8535.       character text field, let's call it x on both. This field can
  8536.       be invisible. The x field in the form is indexed but not
  8537.       derived. The x field on the input screen is derived as "x".
  8538.       A relationship, let's call it "invoice" is entered between the
  8539.       input screen and the form relating the two "x" fields.
  8540.       Assuming the fields for the sequence number are called "invno"
  8541.       the field on the input screen is derived as:-
  8542.  
  8543.          lookup(invoice,invno)+ 1
  8544.  
  8545.       To update the x field in the form which is used purely as a
  8546.       flag to mark the last record your procedure code would be
  8547.       something like:-
  8548.  
  8549.       for invoices with x = "x"
  8550.          invoices.x = blank
  8551.          update record
  8552.       next
  8553.       for invoices new record
  8554.          copy all from input
  8555.       next
  8556.  
  8557.  
  8558.  
  8559.  
  8560.  
  8561.  
  8562.  
  8563.  
  8564.  
  8565.  
  8566.  
  8567.  
  8568.  
  8569.  
  8570.                                 - 137 -
  8571. ................................................................................
  8572.  
  8573.  
  8574.  
  8575.       SET PAPER LENGTH           UTILITY             SET PAPER LENGTH
  8576.  
  8577.  
  8578.       The "Set Paper Length" utility is accessed from the
  8579.       Utilities menu and can also be called from a user menu.
  8580.  
  8581.       There are settings for A3, A4, A5, American Letter and
  8582.       American Legal in both portrait and landscape.
  8583.  
  8584.       When you change the paper length in use then you update
  8585.       pagination for all report outputs.
  8586.  
  8587.       The landscape options are for use in wide carriage printers
  8588.       where the paper can be fed in landscape orientation they do not
  8589.       produce "sideways" printing on narrow carriage printers.
  8590.  
  8591.  
  8592.  
  8593.  
  8594.  
  8595.  
  8596.  
  8597.  
  8598.  
  8599.  
  8600.  
  8601.  
  8602.  
  8603.  
  8604.  
  8605.  
  8606.  
  8607.  
  8608.  
  8609.  
  8610.  
  8611.  
  8612.  
  8613.  
  8614.  
  8615.  
  8616.  
  8617.  
  8618.  
  8619.  
  8620.  
  8621.  
  8622.  
  8623.  
  8624.  
  8625.  
  8626.  
  8627.  
  8628.  
  8629.  
  8630.  
  8631.                                 - 138 -
  8632. ................................................................................
  8633.  
  8634.  
  8635.  
  8636.       SET SYSTEM VALUES           METHOD            SET SYSTEM VALUES
  8637.  
  8638.  
  8639.       The System values System date, System Time and Output can be
  8640.       set within procedure code.
  8641.  
  8642.       Ex.
  8643.          System Date = input.date
  8644.       Ex.
  8645.          If input.print = "Yes" then Output = "Printer"
  8646.  
  8647.       Setting the output from an input screen field means that the
  8648.       user can change the output destination without having to exit
  8649.       back to the menu in procedures which have repeating input
  8650.       screens.
  8651.  
  8652.       If you have several procedures which are individually run to
  8653.       the screen but you also wish to batch execute them to the
  8654.       printer, you can achieve this by including the line:-
  8655.  
  8656.          If Global number = 2 then output = "Printer"
  8657.  
  8658.       then placing the procedures on a batch execute menu which
  8659.       begins with a procedure setting Global Number to 2. and ends
  8660.       with one re setting it to zero.
  8661.  
  8662.  
  8663.  
  8664.  
  8665.  
  8666.  
  8667.  
  8668.  
  8669.  
  8670.  
  8671.  
  8672.  
  8673.  
  8674.  
  8675.  
  8676.  
  8677.  
  8678.  
  8679.  
  8680.  
  8681.  
  8682.  
  8683.  
  8684.  
  8685.  
  8686.  
  8687.  
  8688.  
  8689.  
  8690.  
  8691.  
  8692.                                 - 139 -
  8693. ................................................................................
  8694.  
  8695.  
  8696.  
  8697.       Shell                    File Command                     Shell
  8698.  
  8699.  
  8700.       The "Shell" command executes a DOS command which you supply as
  8701.       the parameter.
  8702.  
  8703.       Shell "DIR C:\WP > C:\EB\DIR.TXT"
  8704.  
  8705.       This writes a directory listing of C:\WP to the file DIR.TXT
  8706.       which you can then open and read from.
  8707.  
  8708.       You can supply the parameter as quoted text, as a variable or
  8709.       field or with a function.
  8710.  
  8711.       Shell Jointext("copy C:\PROGS\",input.directory,"\*.* A:\")
  8712.  
  8713.       In this example a disk vendor can select programs by name on an
  8714.       input screen which looks up the directory in which the program
  8715.       is stored. The procedure then copies all files from that
  8716.       directory to the A: drive.
  8717.  
  8718.       Depending on the procedure you are running, Easy Base uses
  8719.       between 450K and 550K of base memory. You cannot therefore
  8720.       "Shell" to any major program. The main use of "Shell" is to use
  8721.       the DOS copy and Dir commands. You can also shell to a batch
  8722.       file of such commands if you have several tasks to perform.
  8723.  
  8724.       CAUTION
  8725.  
  8726.       The Easy Base Executable file expects to find its support files
  8727.       in the current default directory. If you change drive or
  8728.       directory while shelled out of Easy Base then you must change
  8729.       back before exiting the procedure.
  8730.  
  8731.       If you are writing an application for resale then remember that
  8732.       the end user might not have installed it to C:\EB. Change back
  8733.       to the correct drive and directory by using the system value
  8734.       "Prog_Dir".
  8735.  
  8736.       Declare variables
  8737.          Drive as text : Dir as text
  8738.       end
  8739.       drive = lefttext(prog_dir,2)
  8740.       dir = righttext(prog_dir,lengthtext(prog_dir)-3)
  8741.       shell "Job.Bat"
  8742.       shell drive
  8743.       shell jointext("CD\",dir)
  8744.  
  8745.       When you use "Shell" Easy Base clears the screen and pauses for
  8746.       any DOS error messages. If you know that the command you are
  8747.       about to shell to will not invoke a response from DOS you can
  8748.       add the keyword "Smooth" and Easy Base will not clear the
  8749.       screen or pause.
  8750.  
  8751.       Shell Smooth "DIR C:\FAX > C:\EB\DIR.TXT"
  8752.  
  8753.                                 - 140 -
  8754. ................................................................................
  8755.  
  8756.  
  8757.  
  8758.       SKIP GROUP             PROCEDURE COMMAND             SKIP GROUP
  8759.  
  8760.  
  8761.       The "Skip Group" command excludes an entire group of records
  8762.       from selection by a "For" loop.
  8763.  
  8764.       Ex.
  8765.  
  8766.       for employees with type in order
  8767.          if employees.type = "Part time" then skip group
  8768.          print list items
  8769.       next
  8770.  
  8771.       The "Skip Group" command is not the same as filtering with a
  8772.       "<>" condition.  You could achieve the same result with :-
  8773.  
  8774.       for employees with type in order
  8775.          if employees.type <> "Part time" then
  8776.             print list items
  8777.          end if
  8778.       next
  8779.  
  8780.       but the second procedure would take much longer to run as each
  8781.       part time employee's record would be loaded into memory only to
  8782.       be rejected by the "If" condition.  The first procedure on the
  8783.       other hand only loads a single part time employee's record then
  8784.       skips the entire group by advancing the index pointer in use
  8785.       for record selection.
  8786.  
  8787.       You can also use the "Skip Group" command to terminate
  8788.       selection of a group of records at a given point.
  8789.  
  8790.       declare variables
  8791.          count as number
  8792.       end
  8793.       for employees with type in order
  8794.          count = count + 1
  8795.          if count = 51 then
  8796.             count = 0
  8797.             skip group
  8798.          end if
  8799.          print list items
  8800.       next
  8801.  
  8802.       The above procedure prints the first fifty employees in each
  8803.       "type" group.
  8804.  
  8805.       The "Skip Group" command can be shortened to "Skipgrp"
  8806.  
  8807.       IMPORTANT: The condition for the Skip Group cannot be nested
  8808.       within another "If" condition or "DO LOOP" structure which is
  8809.       itself within the current "For" loop.
  8810.  
  8811.       :- See Skip Record for example.
  8812.  
  8813.  
  8814.                                 - 141 -
  8815. ................................................................................
  8816.  
  8817.  
  8818.  
  8819.       SKIP RECORD            PROCEDURE COMMAND            SKIP RECORD
  8820.  
  8821.  
  8822.       The "Skip Record" command is used to exclude individual records
  8823.       from selection in a "For" Loop.
  8824.  
  8825.       Ex.
  8826.  
  8827.       for employee with worksno in order
  8828.          if employees.worksno = 12 then skip record
  8829.          print list items
  8830.       next
  8831.  
  8832.       The "Skip Record" command has exactly the same effect as
  8833.       filtering with a "<>" condition but is much easier to write if
  8834.       there are many items to exclude
  8835.  
  8836.       for employees with worksno in order
  8837.          if employees.worksno = 12 or employees.worksno = 15 then
  8838.             skip record
  8839.          end if
  8840.          if employees.name = "smith" then skip record
  8841.          if employees.age > 50 then skip record
  8842.       next
  8843.  
  8844.       You can exclude groups of records from an inner loop by
  8845.       applying the "Skip Record" command to a "Unique" outer loop.
  8846.  
  8847.       for employees alias types with type in order unique
  8848.          if types.type = "director" then skip record
  8849.          if types.type = "part time" then skip record
  8850.          for employees with type = types.type
  8851.             print list items
  8852.          next
  8853.       next
  8854.  
  8855.       If you need to exclude groups of records from a single loop you
  8856.       must use the "Skip Group" command.
  8857.  
  8858.       The "Skip Record" command can be shortened to "Skiprec".
  8859.  
  8860.       IMPORTANT:
  8861.  
  8862.       The Skip Record command causes a direct jump to the start of
  8863.       the next iteration of the current "For" loop. The condition
  8864.       for the Skip Record must not be nested within another "If"
  8865.       condition or "Do Loop" structure which is itself within the
  8866.       current For loop.
  8867.  
  8868.       for form
  8869.          if (condition) then
  8870.             if form.type = "Part time" then skip record
  8871.          end if
  8872.       next
  8873.                    This will cause a system error.
  8874.  
  8875.                                 - 142 -
  8876. ................................................................................
  8877.  
  8878.  
  8879.  
  8880.       SPACEPAD                   FUNCTION                    SPACEPAD
  8881.  
  8882.  
  8883.       The Spacepad function pads a text variable to a given length
  8884.       with spaces.
  8885.  
  8886.       Ex.   Spacepad(name,10)
  8887.             < returns "Fred      " if name = "Fred"
  8888.  
  8889.       The spacepad function is used in the creation of compound index
  8890.       fields.
  8891.  
  8892.       For example:    A "Films" form has the fields "title" and
  8893.       "category". To list the films grouped by category in order and
  8894.       with the titles in each category in order create the field
  8895.       "groupindex" as text,long enough to hold both category and
  8896.       title fields and derived as :-
  8897.  
  8898.       Jointext(spacepad(category,15),title)
  8899.                       {15 is length of category field}
  8900.  
  8901.       You can then produce the required printout with the following
  8902.  
  8903.       procedure.
  8904.  
  8905.       ....................format.........................
  8906.  
  8907.       .Report header
  8908.         ═══════════════════════════════════════════════════════════
  8909.                        FILM LIST BY CATEGORY
  8910.         ═══════════════════════════════════════════════════════════
  8911.       .Group header
  8912.         Films in {category field}
  8913.       .List items
  8914.        {title field} Starring {Star field} Running time {length Fld}
  8915.       .end
  8916.  
  8917.       ......................procedure code.................
  8918.       declare output fields
  8919.          films.title:films.star:films.length:films.category
  8920.       end
  8921.       declare variables
  8922.          catcheck as text
  8923.       end
  8924.       '............
  8925.       bold on
  8926.       print report header
  8927.       for films with groupindex in order
  8928.          if films.category <> catcheck then
  8929.             bold on
  8930.             print group header
  8931.             bold off
  8932.          end if
  8933.          print list items
  8934.       next
  8935.  
  8936.                                 - 143 -
  8937. ................................................................................
  8938.  
  8939.  
  8940.  
  8941.       SPELLDAY                   FUNCTION                    SPELLDAY
  8942.  
  8943.  
  8944.       This function spells out the day of the number (1-7) parameter.
  8945.  
  8946.       Ex.   Spellday(dayofweek(system date))
  8947.  
  8948.  
  8949.       Acceptable parameters:
  8950.  
  8951.       Numeric value                              (1-7)
  8952.       Numeric expression evaluating to           (1-7)
  8953.       Numeric Field/variable holding value       (1-7)
  8954.       Any function returning a numeric value     (1-7)
  8955.  
  8956.  
  8957.  
  8958.  
  8959.  
  8960.  
  8961.  
  8962.  
  8963.  
  8964.  
  8965.  
  8966.  
  8967.  
  8968.  
  8969.  
  8970.  
  8971.  
  8972.  
  8973.  
  8974.  
  8975.  
  8976.  
  8977.  
  8978.  
  8979.  
  8980.  
  8981.  
  8982.  
  8983.  
  8984.  
  8985.  
  8986.  
  8987.  
  8988.  
  8989.  
  8990.  
  8991.  
  8992.  
  8993.  
  8994.  
  8995.  
  8996.  
  8997.                                 - 144 -
  8998. ................................................................................
  8999.  
  9000.  
  9001.  
  9002.       SPELLMONTH                 FUNCTION                  SPELLMONTH
  9003.  
  9004.  
  9005.       This function spells out the day of the number (1-12)
  9006.       parameter.
  9007.  
  9008.  
  9009.       Ex.   Spellmonth(month(system date))
  9010.  
  9011.       Ex.   Month = Spellmonth(month(invoices.date))
  9012.  
  9013.  
  9014.       Acceptable parameters:
  9015.  
  9016.       Numeric value                           (1-12)
  9017.       Numeric expression evaluating to        (1-12)
  9018.       Numeric Field/variable holding value    (1-12)
  9019.       Any function returning a numeric value  (1-12)
  9020.  
  9021.  
  9022.  
  9023.  
  9024.  
  9025.  
  9026.  
  9027.  
  9028.  
  9029.  
  9030.  
  9031.  
  9032.  
  9033.  
  9034.  
  9035.  
  9036.  
  9037.  
  9038.  
  9039.  
  9040.  
  9041.  
  9042.  
  9043.  
  9044.  
  9045.  
  9046.  
  9047.  
  9048.  
  9049.  
  9050.  
  9051.  
  9052.  
  9053.  
  9054.  
  9055.  
  9056.  
  9057.  
  9058.                                 - 145 -
  9059. ................................................................................
  9060.  
  9061.  
  9062.  
  9063.       START HERE             DERIVATION PREFIX             START HERE
  9064.  
  9065.  
  9066.       If, in a form or procedure input screen, you want the cursor to
  9067.       start in other than the top left field then derive the field in
  9068.       which you wish the cursor to start with "Start here" .
  9069.  
  9070.       If the field in which the cursor is to start already has a
  9071.       derivation then simply prefix the derivation with "Start here".
  9072.  
  9073.       Ex.
  9074.  
  9075.       start here Lookup(customers,name)
  9076.  
  9077.  
  9078.  
  9079.       Note: You can only have one prefix on any one field derivation.
  9080.  
  9081.  
  9082.  
  9083.  
  9084.  
  9085.  
  9086.  
  9087.  
  9088.  
  9089.  
  9090.  
  9091.  
  9092.  
  9093.  
  9094.  
  9095.  
  9096.  
  9097.  
  9098.  
  9099.  
  9100.  
  9101.  
  9102.  
  9103.  
  9104.  
  9105.  
  9106.  
  9107.  
  9108.  
  9109.  
  9110.  
  9111.  
  9112.  
  9113.  
  9114.  
  9115.  
  9116.  
  9117.  
  9118.  
  9119.                                 - 146 -
  9120. ................................................................................
  9121.  
  9122.  
  9123.  
  9124.       STRINGOF                   FUNCTION                    STRINGOF
  9125.  
  9126.  
  9127.       This function returns a string of characters.
  9128.  
  9129.       Ex.   Stringof(12,"-")
  9130.              < Returns "------------">
  9131.  
  9132.  
  9133.       Ex.  Stringof(5,chr$(240))
  9134.             < Returns "≡≡≡≡≡">
  9135.  
  9136.  
  9137.       One of the most useful applications of the "Stringof" function
  9138.       is to pad output fields in tabular reports with "." characters.
  9139.  
  9140.       Ex.
  9141.  
  9142.       Declare output fields
  9143.          stock.name : stock.price
  9144.       end
  9145.       for stock with name in order
  9146.          stock.name = jointext(stock.name,stringof(30-lengthtext(
  9147.                       stock.name),".")
  9148.          print list items
  9149.       next
  9150.  
  9151.  
  9152.       The printed output from the above report would be in the form:-
  9153.  
  9154.             Gizmo.........................  2.50
  9155.             Sprocket......................  9.95
  9156.             Widget........................  3.10
  9157.  
  9158.  
  9159.  
  9160.       Acceptable parameters:
  9161.  
  9162.       1   Any numeric field, variable, expression or function
  9163.       2   Single quoted character - Function returning a single
  9164.           character
  9165.  
  9166.  
  9167.  
  9168.  
  9169.  
  9170.  
  9171.  
  9172.  
  9173.  
  9174.  
  9175.  
  9176.  
  9177.  
  9178.  
  9179.  
  9180.                                 - 147 -
  9181. ................................................................................
  9182.  
  9183.  
  9184.  
  9185.       SUBINDEX               PROCEDURE COMMAND               SUBINDEX
  9186.  
  9187.  
  9188.       If you need to list records from a form in such a way that they
  9189.       are in groups but with each group in order, there are two ways
  9190.       to accomplish this. You can include a compound index field on
  9191.       the form or you can "subindex" the group during the procedure.
  9192.       The advantage of having a compound index is that no time is
  9193.       wasted "sorting" the sub group during any procedure that uses
  9194.       it and the disadvantage is that it uses extra disk space. As a
  9195.       general rule you should use a compound index where the sub
  9196.       groups are likely to be large and "subindex" during the
  9197.       procedure only if each sub group has up to a few dozen or so
  9198.       records or if you need to order unnatural groupings.
  9199.  
  9200.       Ex.
  9201.  
  9202.       for pupils alias agegroups with age in order unique
  9203.          for pupils alias sortgroup with age = agegroups.age
  9204.             subindex name
  9205.          next
  9206.          for pupils with subindex in order
  9207.             print list items
  9208.          next
  9209.       next
  9210.  
  9211.       The grouping can be extended to more than one level. The
  9212.       following example lists records from a "Videos" form grouped
  9213.       by rental price then by category and with the sub sub group
  9214.       titles in alphabetic order.
  9215.  
  9216.       for videos alias pricegroups with price in order unique
  9217.          for videos alias catgroups with category in order unique
  9218.             for videos alias group with category = catgroups.category
  9219.                if group.price = pricegroups.price then
  9220.                   subindex title
  9221.                end if
  9222.             next
  9223.             for videos with subindex in order
  9224.                print list items
  9225.             next
  9226.          next
  9227.       next
  9228.  
  9229.       As you can see from the listing the output from these examples
  9230.       has to pause between groups while the subindex is written. If
  9231.       you have a 66 Mhz PC and there are twenty records in the sub
  9232.       group you probably won't notice but if you have a 12 Mhz
  9233.       machine and there are a thousand records in the sub group you
  9234.       may as well break for lunch!  If you write a "subindexing"
  9235.       procedure and find that the "Sorting" time is unacceptable then
  9236.       add a compound index field to the form.
  9237.  
  9238.  
  9239.  
  9240.  
  9241.                                 - 148 -
  9242. ................................................................................
  9243.  
  9244.  
  9245.  
  9246.       SUBINDEX               PROCEDURE COMMAND               SUBINDEX
  9247.  
  9248.  
  9249.       Although using compound index fields to produce group ordering
  9250.       is normally preferable to using "Subindex", there is one
  9251.       important area where "Subindex" is more flexible. That is where
  9252.       you need to order records in unnatural groups.
  9253.  
  9254.       Consider the "Videos" form which has fields for "Title" ,
  9255.       "RentalPrice" and "Category".
  9256.  
  9257.       Natural Groupings would be:-
  9258.  
  9259.       Titles with RentalPrice = £2
  9260.       Titles with Category = "Comedy"
  9261.       Titles with RentalPrice = £2 and category = "Horror"
  9262.  
  9263.       Unnatural groupings would be :-
  9264.  
  9265.       Titles with RentalPrice = £2 or Rentalprice = £1.50
  9266.       Titles With RentalPrice = £1.50 or Category = "Western"
  9267.  
  9268.       Although you can make compound index fields to produce
  9269.       unnatural groupings they are not flexible - You need a separate
  9270.       compound index for each unnatural group.
  9271.  
  9272.       If you wished to write a procedure which allowed the user to
  9273.       enter any two video "Categories" and have all titles with
  9274.       either of those two categories listed in order then you must
  9275.       use "Subindex".
  9276.  
  9277.       Ex.
  9278.  
  9279.       for videos alias cat1 with category = input.cat1
  9280.          subindex title
  9281.       next
  9282.       for videos alias cat2 with category = input.cat2
  9283.          subindex title
  9284.       next
  9285.       for videos with subindex in order
  9286.          print list items
  9287.       next
  9288.  
  9289.       You will notice in the above example that two "For" loops add
  9290.       records to the "Subindex" before it is used. Once you start a
  9291.       subindex you can add records to it as often as you wish before
  9292.       using it. Once you use it it is erased.
  9293.  
  9294.       You can only have one "Subindex" active at any time. You can
  9295.       use any number of "Subindexes" within one procedure but each
  9296.       one must be "used" before the next is started.
  9297.  
  9298.  
  9299.  
  9300.  
  9301.  
  9302.                                 - 149 -
  9303. ................................................................................
  9304.  
  9305.  
  9306.  
  9307.       SYSTEM DATE              SYSTEM VALUE               SYSTEM DATE
  9308.  
  9309.  
  9310.       You can use your computers inbuilt date anywhere in field
  9311.       derivations or procedure code by simply quoting "system date".
  9312.  
  9313.       Ex.
  9314.  
  9315.       for diary with date = system date
  9316.          print list items
  9317.       next
  9318.  
  9319.  
  9320.  
  9321.  
  9322.  
  9323.  
  9324.  
  9325.  
  9326.  
  9327.  
  9328.  
  9329.  
  9330.  
  9331.  
  9332.  
  9333.  
  9334.  
  9335.  
  9336.  
  9337.  
  9338.  
  9339.  
  9340.  
  9341.  
  9342.  
  9343.  
  9344.  
  9345.  
  9346.  
  9347.  
  9348.  
  9349.  
  9350.  
  9351.  
  9352.  
  9353.  
  9354.  
  9355.  
  9356.  
  9357.  
  9358.  
  9359.  
  9360.  
  9361.  
  9362.  
  9363.                                 - 150 -
  9364. ................................................................................
  9365.  
  9366.  
  9367.  
  9368.       SYSTEM TIME              SYSTEM VALUE               SYSTEM TIME
  9369.  
  9370.  
  9371.       You can use your computers inbuilt time anywhere in field
  9372.       derivations or procedure code by simply quoting "system time".
  9373.  
  9374.       Ex.
  9375.  
  9376.       for stockitems with stockno = input.stockno
  9377.          lastcheckeddate = system date
  9378.          lastcheckedtime = system time
  9379.          update record
  9380.       next
  9381.  
  9382.  
  9383.  
  9384.  
  9385.  
  9386.  
  9387.  
  9388.  
  9389.  
  9390.  
  9391.  
  9392.  
  9393.  
  9394.  
  9395.  
  9396.  
  9397.  
  9398.  
  9399.  
  9400.  
  9401.  
  9402.  
  9403.  
  9404.  
  9405.  
  9406.  
  9407.  
  9408.  
  9409.  
  9410.  
  9411.  
  9412.  
  9413.  
  9414.  
  9415.  
  9416.  
  9417.  
  9418.  
  9419.  
  9420.  
  9421.  
  9422.  
  9423.  
  9424.                                 - 151 -
  9425. ................................................................................
  9426.  
  9427.  
  9428.  
  9429.       TABULATION                  METHOD                   TABULATION
  9430.  
  9431.  
  9432.       To create a printout in which fields are enclosed within a
  9433.       lined table use the linedrawing facility in the format editor
  9434.       to create a page header and page footer containing the top and
  9435.       bottom of the table and insert only the vertical lines between
  9436.       the fields in the list items section.
  9437.  
  9438.       Ex.
  9439.  
  9440.       Declare output fields
  9441.          stock.name : stock.price
  9442.       end
  9443.       print page header
  9444.       for stock with name in order
  9445.          if bottom margin < 0.7 then
  9446.             print page footer
  9447.             page feed
  9448.             print page header
  9449.          end if
  9450.          print list items
  9451.       next
  9452.       print page footer
  9453.       Page feed
  9454.  
  9455.       ........................format.........................
  9456.  
  9457.       .page header
  9458.             ╔════════════════════╤═══════════════╗
  9459.             ║ Name               │  Price        ║
  9460.             ╠════════════════════╪═══════════════╣
  9461.       .list items
  9462.             ║ {Name Field     }  │ {Price Fld. } ║
  9463.       .page footer
  9464.             ╚════════════════════╧═══════════════╝
  9465.       .end
  9466.  
  9467.  
  9468.  
  9469.  
  9470.  
  9471.  
  9472.  
  9473.  
  9474.  
  9475.  
  9476.  
  9477.  
  9478.  
  9479.  
  9480.  
  9481.  
  9482.  
  9483.  
  9484.  
  9485.                                 - 152 -
  9486. ................................................................................
  9487.  
  9488.  
  9489.  
  9490.       TEXT                      FIELD TYPE                       TEXT
  9491.  
  9492.  
  9493.       The text field type can be up to 80 characters long.
  9494.  
  9495.       Cut copy and paste operations are available between all text,
  9496.       and textblock fields :
  9497.  
  9498.       Use Shift plus the arrow keys to mark the text you wish to cut
  9499.       or copy. When you release the keys the cut or copy choice will
  9500.       appear.
  9501.  
  9502.       To paste cut text position the cursor where you want it
  9503.       inserted and press Shift plus Ins.
  9504.  
  9505.       Spell Checking is also available in text fields -
  9506.          Press Ctrl + S
  9507.  
  9508.  
  9509.  
  9510.  
  9511.  
  9512.  
  9513.  
  9514.  
  9515.  
  9516.  
  9517.  
  9518.  
  9519.  
  9520.  
  9521.  
  9522.  
  9523.  
  9524.  
  9525.  
  9526.  
  9527.  
  9528.  
  9529.  
  9530.  
  9531.  
  9532.  
  9533.  
  9534.  
  9535.  
  9536.  
  9537.  
  9538.  
  9539.  
  9540.  
  9541.  
  9542.  
  9543.  
  9544.  
  9545.  
  9546.                                 - 153 -
  9547. ................................................................................
  9548.  
  9549.  
  9550.  
  9551.       TEXT BLOCK                FIELD TYPE                 TEXT BLOCK
  9552.  
  9553.  
  9554.       When you Define a field with the field type "Text Block" then
  9555.       instead of entering a field length you shade out the area which
  9556.       you wish the field to cover using the arrow keys.
  9557.  
  9558.       Textblock fields offer many of the facilities of a
  9559.       wordprocessor including cut and paste, wordwrap and spell
  9560.       checking.
  9561.  
  9562.       Useful widths for A4 and Letter size paper are 63 characters if
  9563.       you intend to print at 10 characters per inch and 75 characters
  9564.       if you intend to print at 12 characters per inch. This document
  9565.       for instance was created in 63 character wide text blocks.
  9566.  
  9567.       The maximum width of a text block field on screen is 80
  9568.       characters. You can however redefine it up to 230 characters
  9569.       wide in procedure printouts and Easy Base will reformat your
  9570.       paragraphs to the new width.
  9571.  
  9572.       A text block field is not a "memo" field. It can be indexed and
  9573.       derived.
  9574.  
  9575.  
  9576.  
  9577.  
  9578.  
  9579.  
  9580.  
  9581.  
  9582.  
  9583.  
  9584.  
  9585.  
  9586.  
  9587.  
  9588.  
  9589.  
  9590.  
  9591.  
  9592.  
  9593.  
  9594.  
  9595.  
  9596.  
  9597.  
  9598.  
  9599.  
  9600.  
  9601.  
  9602.  
  9603.  
  9604.  
  9605.  
  9606.  
  9607.                                 - 154 -
  9608. ................................................................................
  9609.  
  9610.  
  9611.  
  9612.       TIME                      FIELD TYPE                       TIME
  9613.  
  9614.  
  9615.       The Easy Base "time" field has the eight character format:-
  9616.  
  9617.       11:20:20    (Hours:Minutes:Seconds)
  9618.  
  9619.       You can record time data in any format you wish by using a
  9620.       "Formatted Text" field but you must use a "Time" field if you
  9621.       wish to perform addition and subtraction operations on time
  9622.       values.  (in seconds)
  9623.  
  9624.       Time fields are automatically checked for validity.
  9625.  
  9626.  
  9627.       See Also:-  Maketime
  9628.  
  9629.  
  9630.  
  9631.  
  9632.  
  9633.  
  9634.  
  9635.  
  9636.  
  9637.  
  9638.  
  9639.  
  9640.  
  9641.  
  9642.  
  9643.  
  9644.  
  9645.  
  9646.  
  9647.  
  9648.  
  9649.  
  9650.  
  9651.  
  9652.  
  9653.  
  9654.  
  9655.  
  9656.  
  9657.  
  9658.  
  9659.  
  9660.  
  9661.  
  9662.  
  9663.  
  9664.  
  9665.  
  9666.  
  9667.  
  9668.                                 - 155 -
  9669. ................................................................................
  9670.  
  9671.  
  9672.  
  9673.       TIMEAMPM                   FUNCTION                    TIMEAMPM
  9674.  
  9675.  
  9676.       This function returns the hour ( 0 - 12) plus am. or pm. from
  9677.       the time field parameter.
  9678.  
  9679.       Ex. Timeampm(system time)
  9680.  
  9681.       Ex.
  9682.       -------------------------format----------------------------
  9683.       .Report header
  9684.                      Appointments for {Apps.Date Field}
  9685.       .List items
  9686.                 {Apps.Name Field      }   at  {Time Field}
  9687.       .End
  9688.       -------------------------code----------------------------
  9689.       declare output fields
  9690.          Apps.name
  9691.          Apps.date
  9692.          Time
  9693.       end
  9694.       print report header
  9695.       for apps with date = system date
  9696.          time = timeampm(apps.time)
  9697.          print list items
  9698.       next
  9699.  
  9700.  
  9701.       Acceptable parameters:
  9702.  
  9703.       System time
  9704.       Time field
  9705.       Maketime function
  9706.       Time expression
  9707.  
  9708.  
  9709.  
  9710.  
  9711.  
  9712.  
  9713.  
  9714.  
  9715.  
  9716.  
  9717.  
  9718.  
  9719.  
  9720.  
  9721.  
  9722.  
  9723.  
  9724.  
  9725.  
  9726.  
  9727.  
  9728.  
  9729.                                 - 156 -
  9730. ................................................................................
  9731.  
  9732.  
  9733.  
  9734.       TOTAL COPIES             SYSTEM VALUE              TOTAL COPIES
  9735.  
  9736.  
  9737.       Whenever a procedure enters a "FOR" loop qualified by "With
  9738.       fieldname = " the total number of records which match the
  9739.       qualification value is available in the system value "Total
  9740.       Copies"
  9741.  
  9742.       Total Copies is extracted directly from the index file and
  9743.       relieves you of a time consuming loop all the way through a
  9744.       form updating a counter.
  9745.  
  9746.       In other words:-
  9747.  
  9748.       for books with category = "fiction"
  9749.          count = count + 1
  9750.       next
  9751.  
  9752.       can be replaced with:-
  9753.  
  9754.       for books with category = "fiction"
  9755.          count = total copies
  9756.          exit for
  9757.       next
  9758.  
  9759.       Unlike "Total Records" the "Total Copies" value never includes
  9760.       records marked for deletion.
  9761.  
  9762.       Easy Base does not track separate values for "Total Records" or
  9763.       "Total Copies" when there are nested "For" loops. The values
  9764.       are set for the outer loop on the first iteration and reset for
  9765.       the inner loop on its first iteration. If you need a value for
  9766.       "Total Records" or for "Total Copies" after your procedure has
  9767.       entered another loop then you must transfer the value to a
  9768.       variable while it is available. (See the example for "Display
  9769.       Status")
  9770.  
  9771.       Easy Base does not update "Total Records" or "Total Copies"
  9772.       when records are added or deleted during a procedure.
  9773.  
  9774.  
  9775.  
  9776.  
  9777.  
  9778.  
  9779.  
  9780.  
  9781.  
  9782.  
  9783.  
  9784.  
  9785.  
  9786.  
  9787.  
  9788.  
  9789.  
  9790.                                 - 157 -
  9791. ................................................................................
  9792.  
  9793.  
  9794.  
  9795.       TOTAL RECORDS            SYSTEM VALUE             TOTAL RECORDS
  9796.  
  9797.  
  9798.       Whenever a procedure enters a "FOR" loop the total number of
  9799.       records in the form is available in the system value "Total
  9800.       records"
  9801.  
  9802.       Ex.
  9803.       The following code fragment updates a "Customer summary" form
  9804.       with the total number of customers in the "Customers" form.
  9805.  
  9806.       declare variables
  9807.         tot as number
  9808.       end
  9809.       for customers with acno = 1
  9810.          tot = total records
  9811.          exit for
  9812.       next
  9813.       for customersummary
  9814.          customersummary.totalcustomers = tot
  9815.          update record
  9816.       next
  9817.  
  9818.       Caution.
  9819.  
  9820.       Provided that the "For" loop is qualified by a "with" statement
  9821.       then the "Total Records" value is extracted directly from the
  9822.       open index file and is the total number of "Live Records".
  9823.  
  9824.       If you access the "Total records" value in an unqualified "For"
  9825.       loop then there is no index file open and the "Total Records"
  9826.       value is derived by dividing the forms file length by the
  9827.       record length. It therefore represents the total number of
  9828.       records in the form "Live" and "Deleted".
  9829.  
  9830.       Ex.
  9831.  
  9832.       If a form "books" has 2000 records and 10 are marked for
  9833.       deletion at the next re-pack then "count" returns 1990 in:-
  9834.  
  9835.       for books with catalogueno = 1
  9836.         count = total records
  9837.       next
  9838.  
  9839.       and 2000 in :-
  9840.  
  9841.       for books
  9842.          count = total records
  9843.          exit for
  9844.       next
  9845.  
  9846.  
  9847.  
  9848.  
  9849.  
  9850.  
  9851.                                 - 158 -
  9852. ................................................................................
  9853.  
  9854.  
  9855.  
  9856.       TOTALS & SUB TOTALS         METHOD          TOTALS & SUB TOTALS
  9857.  
  9858.  
  9859.       To produce totals and sub totals in printouts use ad hoc fields
  9860.       to hold the values and increment them during each iteration of
  9861.       the output loops. The following code lists all entries in a
  9862.       clients time sheet form with the cost of work in hand totalled
  9863.       and sub totalled for each client.
  9864.  
  9865.       Declare output fields
  9866.         Clients.Name:Timesheet.Hrs:Timesheet.Mins:Timesheet.Amount
  9867.         Timesheet.date : Subtotal : Grandtotal
  9868.       end
  9869.       Print Report Header
  9870.       for Clients with name in order
  9871.          Print Group Header
  9872.          Subtotal = 0
  9873.          For Timesheet with Acno = Clients.Acno
  9874.             Subtotal = Subtotal + timesheet.amount
  9875.             Grandtotal = Grandtotal + Timesheet.amount
  9876.             Print List Items
  9877.          next
  9878.          Print Group Footer
  9879.       next
  9880.       Print report footer
  9881.  
  9882.       .......................Output Format.........................
  9883.       .Report Header
  9884.          ═════════════════════════════════════════════════════════
  9885.                    Work in Hand Totalled by Client
  9886.          ═════════════════════════════════════════════════════════
  9887.       .Group Header
  9888.  
  9889.          ██████████████████
  9890.       .List Items
  9891.             ████████      ██Hrs ██Mins                     ██████
  9892.       .Group Footer
  9893.                                                        ──────────
  9894.           Total for ██████████████████                 ██████████
  9895.                                                        ══════════
  9896.       .Report Footer
  9897.          ═════════════════════════════════════════════════════════
  9898.          Total Work In Hand                            ██████████
  9899.          ═════════════════════════════════════════════════════════
  9900.       .end
  9901.  
  9902.       The field in the Group Header is Clients.name
  9903.       The fields in List Items are Timesheet.date, Timesheet.Hrs,
  9904.       Timesheet.Mins and Timesheet.amount.
  9905.       The fields in Group Footer are Clients.name and Subtotal.
  9906.       The field in Report Footer is Grandtotal.
  9907.  
  9908.  
  9909.  
  9910.  
  9911.  
  9912.                                 - 159 -
  9913. ................................................................................
  9914.  
  9915.  
  9916.  
  9917.       UPDATE RECORD          PROCEDURE COMMAND          UPDATE RECORD
  9918.  
  9919.  
  9920.       The "Update record" command is used to alter the contents of
  9921.       one or many records in a form.
  9922.  
  9923.       Ex.
  9924.  
  9925.       for stock with item = input.item
  9926.          stock.price = input.price
  9927.          stock.pricechangedate = system date
  9928.          update record
  9929.       next
  9930.  
  9931.       This example changes the price of a single "Stock" item.
  9932.  
  9933.  
  9934.       for employees with taxcode = input.oldtaxcode
  9935.          employees.taxcode = input.newtaxcode
  9936.          update record
  9937.       next
  9938.  
  9939.       This example changes the taxcode field of all the employees
  9940.       whose present taxcode is the same as the input screen
  9941.       "oldtaxcode" to the input screen "newtaxcode".
  9942.  
  9943.  
  9944.       for employees
  9945.          employees.taxcode = employees.taxcode + 60
  9946.          update record
  9947.       next
  9948.  
  9949.       This example increases the taxcode of all employees by sixty.
  9950.  
  9951.  
  9952.  
  9953.  
  9954.  
  9955.  
  9956.  
  9957.  
  9958.  
  9959.  
  9960.  
  9961.  
  9962.  
  9963.  
  9964.  
  9965.  
  9966.  
  9967.  
  9968.  
  9969.  
  9970.  
  9971.  
  9972.  
  9973.                                 - 160 -
  9974. ................................................................................
  9975.  
  9976.  
  9977.  
  9978.       UPPER                      FUNCTION                       UPPER
  9979.  
  9980.  
  9981.       Returns the Uppercase of a text field or variable.
  9982.  
  9983.       Ex.  Upper(postcode)
  9984.            < shows the postcode field in uppercase>
  9985.  
  9986.       Ex.
  9987.       '.......................
  9988.       declare output fields
  9989.          labelname
  9990.          labeladdress
  9991.          labelcode
  9992.       end
  9993.       for customers with maillist = "yes"
  9994.          Labelname = Upper(customers.name)
  9995.          Labeladdress = Upper(customers.address)
  9996.          Labelcode = customers.postcode
  9997.          print labels
  9998.       next
  9999.  
  10000.       Acceptable parameters:
  10001.  
  10002.       Quoted text
  10003.       Text field/variable
  10004.  
  10005.  
  10006.  
  10007.  
  10008.  
  10009.  
  10010.  
  10011.  
  10012.  
  10013.  
  10014.  
  10015.  
  10016.  
  10017.  
  10018.  
  10019.  
  10020.  
  10021.  
  10022.  
  10023.  
  10024.  
  10025.  
  10026.  
  10027.  
  10028.  
  10029.  
  10030.  
  10031.  
  10032.  
  10033.  
  10034.                                 - 161 -
  10035. ................................................................................
  10036.  
  10037.  
  10038.  
  10039.       V.A.T. FUNCTIONS           FUNCTION            V.A.T. FUNCTIONS
  10040.  
  10041.  
  10042.       Easy Base has a set of five VAT rates which can be altered from
  10043.       the utilities menu. There are four VAT functions:-
  10044.          VATin
  10045.          VATon
  10046.          PlusVAT
  10047.          MinusVAT
  10048.  
  10049.       Ex.   VATin(retailprice,2)
  10050.              < Returns the VAT content of "retailprice" at VAT rate 2
  10051.  
  10052.       Ex.   VATon(netprice,4)
  10053.             < Returns the VAT to be added to "netprice" at VAT rate 4
  10054.  
  10055.       Ex.   PlusVAT(netprice,3)
  10056.             < Returns the VAT inclusive price at VAT rate 3>
  10057.  
  10058.       Ex.   MinusVAT(retailprice,2)
  10059.             < Returns the net price of "retailprice" before VAT at
  10060.               VAT rate 2>
  10061.  
  10062.        (assumes Retailprice as VAT Inclusive and Netprice exclusive)
  10063.  
  10064.       If the second parameter (rate) is omitted from any of the VAT
  10065.       functions then Rate 1 is assumed.
  10066.  
  10067.       Ex.   Gross = PlusVAT(input.net)
  10068.             < The variable "Gross" = the VAT inclusive of the input
  10069.              screen field "net" calculated at rate 1.>
  10070.  
  10071.       Although the VAT functions are primarily included for business
  10072.       applications, they can be used for any purpose where a
  10073.       percentage needs to be changed globally throughout an
  10074.       application without the need to alter each procedure or field
  10075.       derivation in which it is used.
  10076.  
  10077.       Acceptable parameters:
  10078.  
  10079.       1   Any numeric value, field, variable, expression or function
  10080.       2   As Parameter 1 but evaluating between 1 an 5
  10081.  
  10082.  
  10083.  
  10084.  
  10085.  
  10086.  
  10087.  
  10088.  
  10089.  
  10090.  
  10091.  
  10092.  
  10093.  
  10094.  
  10095.                                 - 162 -
  10096. ................................................................................
  10097.  
  10098.  
  10099.  
  10100.       Write                    File Command                     Write
  10101.  
  10102.  
  10103.       The "Write" command writes data to a non Easy Base file which
  10104.       has been opened with the "Open" command.
  10105.  
  10106.       The Syntax is:
  10107.  
  10108.       Write (Text, Variable, Field or Function) [Line_len (length)]
  10109.  
  10110.       The Line_Len keyword and parameter are not required.
  10111.  
  10112.       Ex.
  10113.  
  10114.       Write "Once upon a time"
  10115.       Write LineVar
  10116.       Write Customers.name
  10117.       Write Jointext(customers.forname," ",customers.surname)
  10118.       Write Customers.notes line_len 60
  10119.  
  10120.       Notes:-
  10121.  
  10122.       The contents of a text field is supplied without leading or
  10123.       trailing spaces. The contents of a text variable is supplied
  10124.       without trailing spaces. You can pad the output with either of
  10125.       the functions "Spacepad" or "stringof".
  10126.  
  10127.       The following code writes customers names and account Nos in
  10128.       two columns to an ASCII file.
  10129.  
  10130.       Open "C:\WP\NAMES.TXT"
  10131.       for customers with name in order
  10132.          write stringof(5,chr$(32))
  10133.          write spacepad(customers.name,30)
  10134.          write customers.acno
  10135.          write chr$(13)
  10136.          write chr$(10)
  10137.       next
  10138.  
  10139.       The contents of a text block field is supplied reformatable ie
  10140.       a single CHR$(13) is used to denote where a new line is to be
  10141.       forced. If you write a text block field without the Line_len
  10142.       keyword it will be written in this format.
  10143.  
  10144.       To write a text block field as ASCII Lines use the Line_Len
  10145.       keyword. The Line_Len value does not have to be the same as the
  10146.       width of the text block field. Easy Base will word wrap the
  10147.       contents to whatever Lin_Len value you supply.
  10148.  
  10149.       You cannot write quotation marks within quoted text.
  10150.       To write "Fred said "@*!" to Bill" you must replace the inner
  10151.       quotation marks with ASCII character 127. (Hold down the Alt
  10152.       key and type 127 on the numeric keypad)
  10153.  
  10154.       See also: Open, Close, Read, Seek, Find
  10155.  
  10156.                                 - 163 -
  10157. ................................................................................
  10158.  
  10159.  
  10160.  
  10161.       YEAR                       FUNCTION                        YEAR
  10162.  
  10163.  
  10164.       This function returns the year number from a date parameter.
  10165.  
  10166.       Ex.    Year(system date)
  10167.  
  10168.       Ex.
  10169.  
  10170.       Carage = jointext((year(system date)-year(registered))," Years
  10171.       old")
  10172.  
  10173.  
  10174.       Acceptable parameters:
  10175.  
  10176.       System date
  10177.       Date field
  10178.       Makedate function
  10179.       Date expression
  10180.  
  10181.  
  10182.  
  10183.  
  10184.  
  10185.  
  10186.  
  10187.  
  10188.  
  10189.  
  10190.  
  10191.  
  10192.  
  10193.  
  10194.  
  10195.  
  10196.  
  10197.  
  10198.  
  10199.  
  10200.  
  10201.  
  10202.  
  10203.  
  10204.  
  10205.  
  10206.  
  10207.  
  10208.  
  10209.  
  10210.  
  10211.  
  10212.  
  10213.  
  10214.  
  10215.  
  10216.  
  10217.                                 - 164 -
  10218. ................................................................................
  10219.  
  10220.  
  10221.  
  10222.       ZEROPAD                    FUNCTION                     ZEROPAD
  10223.  
  10224.  
  10225.       The Zeropad function pads an integer or fixed point field to a
  10226.       given number of places left and right of the decimal point.
  10227.  
  10228.       Ex.  Zeropad(price,3,2)
  10229.            <Returns "001.50" if price = 1.5>
  10230.  
  10231.       Ex.  Zeropad(acno,6,0)
  10232.            <Returns "004532" if acno = 4,532>
  10233.  
  10234.       The Zeropad function can be used as in the second example to
  10235.       return a fixed length numeric string from an integer field.
  10236.       It's main use, however, is in the creation of fields for
  10237.       compound indices where one of the fields to be compounded is a
  10238.       number.
  10239.  
  10240.       For example: A school has all pupils names and ages recorded on
  10241.       a form in fields "name" and "age". To create an index which
  10242.       will list pupils names alphabetically but grouped by age a
  10243.       compound field which is invisible and does not allow user entry
  10244.       is created as a text field derived with:-
  10245.       Jointext(zeropad(age,2,0),name)
  10246.  
  10247.       Because the compound field is text the index file will be
  10248.       sorted alphabetically. If you sort the numbers 8,9 and 12
  10249.       alphabetically you get 12,8,9 because the one in 12 comes
  10250.       before 8. If however you sort the numbers 08,09 and 12
  10251.       alphabetically you get the correct numeric order.
  10252.  
  10253.       By using the zeropad function in the above example and indexing
  10254.       the compound field,let's call it "unifield" you could then
  10255.       print out the pupils in age groups with the names in each group
  10256.       arranged alphabetically.
  10257.       .........................format.................
  10258.       .group header
  10259.        Pupils aged {pupils.age field}
  10260.       .list items
  10261.               {pupils.name field}
  10262.       .end
  10263.       .........................procedure code.........
  10264.       declare output fields
  10265.          pupils.name:pupils.age
  10266.       end
  10267.       declare variables
  10268.          agecheck as number
  10269.       end
  10270.       agecheck = 0
  10271.       for pupils with unifield in order
  10272.          if pupils.age <> agecheck then print group header
  10273.          agecheck = pupils.age
  10274.          print list items
  10275.       next
  10276.  
  10277.  
  10278.                                 - 165 -
  10279. ................................................................................
  10280.